返回一个数组在 C# 中操作原始值

     2023-04-13     246

关键词:

【中文标题】返回一个数组在 C# 中操作原始值【英文标题】:Returning an Array Manipulates Original Value in C# 【发布时间】:2018-11-28 23:36:17 【问题描述】:

这是我在网站上的第一个问题,我相信我会在这里找到答案。

在学校,我尝试编写一些基本的 C# 编码来应对我们面临的挑战。

问题来了:

通常,当我通过一个方法传递一个值时,我不会遇到问题。像这样:

static void Main(string[] args)

    // Declare Integer
    int originalInt = 20;

    // Call the Method
    int multipliedInt = Multiplication(originalInt);

    // Prompt
    Console.WriteLine("Original: 0 Modified: 1", originalInt, multipliedInt);


// Method
static public int Multiplication(int original) 

    // Quik Maffs
    int modifiedValue = original * 2;

    return modifiedValue;

上面的例子工作得很好。原值为20,修改后值为40。

但是,当我尝试对数组执行此操作时,情况会发生变化:

static void Main(string[] args)

    // Declare Original Array
    int[] originalArray = new int[] 1, 4, 6, 8, 12;

    // Call Method
    int[] multipliedArray = Multiplication(originalArray);

    // Prompt
    Console.WriteLine("Original: [0], Multiplied: [1]", String.Join(", ", originalArray), String.Join(", ", multipliedArray));


// Method
static public int[] Multiplication(int[] original) 

    // New Int
    int[] modified = original;

    // Loop
    for (int i = 0; i < modified.Length; i++) 
    
        modified[i] *= 2;
    

    return modified;

上面的代码两次返回修改后的值。它似乎也修改了原始值。

知道为什么会这样吗?

【问题讨论】:

数组是通过引用传递的,因此您传递的是对原始数组的引用,而不是您期望的值的副本。 不同之处在于,在第一个示例中,您通过值传递变量。在第二个示例中,您将传递对数组的引用。当您使用 int 参数时,该方法会接收该值的副本。使用数组,您传递的是对数组的引用,而不是它的副本。 @JonathonChase 啊,我不知道这个。所以我假设我必须在方法中创建一个新的 int 数组。 @emsimpson92 这仍然需要修改原始数组。我认为 OP 想要一个具有原始值的数组副本和一个具有新值的副本。 没有必要道歉。阅读副本,希望它对您有价值。 【参考方案1】:

int 是一个值类型。当您将值类型传递给方法时,您会传递该值的副本。

数组是引用类型。当您将引用类型传递给方法时,您会传递引用的副本……但副本和原始对象仍然引用 same 对象。

现在看来您可能已经明白了很多,因为这段代码:(这就是我重新打开问题的原因......股票参考与价值的答案不会被削减在这里)

int[] modified = original;

但是,引用类型发生的另一件事是赋值也只复制引用。因此,sn-p 中的modifiedoriginal 再次引用了 same 数组对象。

要解决此问题,您需要制作数组的实际深层副本。有几种方法可以做到这一点。我倾向于这样写方法:

static public IEnumerable<int> Multiplication(IEnumerable<int> original) 

    return original.Select(i => i * 2);

...当且仅当我真的需要一个完整的数组时,在方法调用的末尾附加一个.ToArray()(提示:事实证明你通常不需要),像这样:

int[] multipliedArray = Multiplication(originalArray).ToArray();

或者像这样:

var multipliedArray = Multiplication(originalArray);

但我知道这里有很多东西对于初学者来说不是很熟悉。您可以尝试更多类似的方法:

static public int[] Multiplication(int[] original) 

    int[] modifed = new int[original.Length];

    for (int i = 0; i < original.Length; i++)
    
        modified[i] = original[i] * 2;
    

    return modified;

【讨论】:

哇,非常感谢您抽出时间来写这个答案。非常感谢!我也尝试了你的解决方案,它对我帮助很大。不仅在代码中,而且在我对主题的理解中。

如何使用 regex.split 在 c# 中解析 html 并返回值数组

】如何使用regex.split在c#中解析html并返回值数组【英文标题】:Howtoparsehtmlandreturnarrayofvaluesinc#usingregex.split【发布时间】:2011-04-1723:35:16【问题描述】:目前我正在尝试解析一些html并返回一个包含每个元素内的值的数组。例如:... 查看详情

循环遍历一个大数组并将值加在一起 ​​C#

】循环遍历一个大数组并将值加在一起​​C#【英文标题】:LoopingthroughalargearrayandaddingthevaluestogetherC#【发布时间】:2021-06-1800:12:12【问题描述】:我正在尝试遍历一个包含180个元素的数组,并将前60个元素加在一起并将其存储在... 查看详情

C#函数返回两个值[重复]

】C#函数返回两个值[重复]【英文标题】:C#Functionreturningtwovalues[duplicate]【发布时间】:2011-03-0900:08:25【问题描述】:我想要一个函数,我将在其中输入一个数组,因此我需要另一个数组和一个整数值。这可能吗?例子:privateint[... 查看详情

返回一个二维数组(在 C# 和 C++ 中)

】返回一个二维数组(在C#和C++中)【英文标题】:returninga2Darray(inC#andinC++)【发布时间】:2018-01-1701:05:46【问题描述】:我正在编写一个返回二维数组的函数。这让我想到了这在C#(带有垃圾收集)和C++(无GC)中的含义(为什... 查看详情

如何在 C# 中返回一个数组而不在方法内创建数组? [关闭]

】如何在C#中返回一个数组而不在方法内创建数组?[关闭]【英文标题】:HowtoreturnanarrayinC#withoutcreatingarrayinsidethemethod?[closed]【发布时间】:2018-04-1521:52:05【问题描述】:我必须在做一些计算后返回一个数组。但是如果不在方法... 查看详情

C# 并行返回值

】C#并行返回值【英文标题】:C#parallelreturnvalue【发布时间】:2016-09-1810:58:53【问题描述】:我使用以下代码尝试使用来自两个单独数组的值进行一些计算。我一直在尝试聚合一个值列表作为最后一步,但每次我运行程序时,列... 查看详情

c# - 从对象数组中检索一个值

...在从我的c#应用程序调用一个外部API,它以json数组的形式返回数据,响应正文如下所示"result":["name":"Tom","id":"EM123","name":"John","id":"EM154"]在我的c#应用程序中,我只想检索第一个元素的I 查看详情

C# 函数返回一个值并显示在网页中

】C#函数返回一个值并显示在网页中【英文标题】:C#functionsreturnsavalueandshowinwebpage【发布时间】:2013-03-1311:46:39【问题描述】:我在我的apx.cs文件中用C#编写了以下函数[WebMethod]publicstaticstringSendForm()stringmessage="helloworld";returnmessage... 查看详情

c#数组之操作方法

...就确定其大小。数组中的每项都按索引进行访问,索引是一个数字,指示对象在数组中的存储位置或槽。数组既可用于存储引用类型,也可用于存储值类型。  查看详情

如何在 C# 字典中按值索引过滤项目?

...问题描述】:我正在尝试编写一个根据值索引和条​​件返回项目值的方法。例如,在下面,如果我将索引值传递为0,它应该从不具有值5的整数数组中返回键和第一个值。publicstaticDictionary<string,int[]>_di 查看详情

C# 2D 数组匹配并返回 1 维

】C#2D数组匹配并返回1维【英文标题】:C#2DArrayMatchandReturn1Dimension【发布时间】:2021-08-1218:53:28【问题描述】:我有一个[Name,Code]格式的二维字符串数组,其中Code是一个大写字母。我想根据“代码”的匹配返回数组中的所有“名... 查看详情

比较两个数组并返回一个新数组,其中包含仅在原始数组之一中找到的任何项目

】比较两个数组并返回一个新数组,其中包含仅在原始数组之一中找到的任何项目【英文标题】:Comparetwoarraysandreturnanewarraywithanyitemsonlyfoundinoneoftheoriginalarrays【发布时间】:2016-04-2215:02:41【问题描述】:["diorite","andes... 查看详情

C# - 从另一个 AppDomain 中的方法返回值

】C#-从另一个AppDomain中的方法返回值【英文标题】:C#-ReturningValueFromaMethodinAnotherAppDomain【发布时间】:2012-09-2622:17:31【问题描述】:我有一个场景,我从我的C#代码中的操作将DLL添加到GAC。然后我需要对新添加的DLL执行Assembly.Loa... 查看详情

如何在 C# 数组中查找和显示特定值

...发布时间】:2021-07-1921:02:51【问题描述】:我用C#编写了一个程序,它读取一个数字文件,将它们转换为一个数组,并使用冒泡排序以数字顺序显示它们,我正在尝试在程序打印数组后让它在冒泡排序之后找到并打印数组中的第1... 查看详情

如何在c#中返回结构复杂的字符串数组

】如何在c#中返回结构复杂的字符串数组【英文标题】:Howtoreturnastringarraywithcomplexstructureinc#【发布时间】:2021-06-2105:41:27【问题描述】:对于遗留系统,我需要返回一个对象,而不是在其中包含一个键值而不是日期,并且内部... 查看详情

调用方法并将返回值分配给数组时,为啥C#在调用方法时使用数组引用?

】调用方法并将返回值分配给数组时,为啥C#在调用方法时使用数组引用?【英文标题】:Whencallingamethodandassigningreturnedvaluetoanarray,whyisC#usingthearrayreferencewhenmethodwascalled?调用方法并将返回值分配给数组时,为什么C#在调用方法时... 查看详情

在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回

】在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回【英文标题】:UsingthemethodofC/C++librariesinC#returnarandomvalue,insteadoftheaboveinreturn【发布时间】:2015-08-2811:02:07【问题描述】:当我从C++DLL调用C#函数时,它返回一个随机值... 查看详情

js字符串的操作方法

...,依次递增。不会修改原字符串,会将拼接好的字符串以返回值的方式返回出来。可以在字符串中查找指定的字符。可以查到的的话返回值字符所在的位置。查不到返回-1。如果要查找的字符在字符中存在多个,永远只找一个。... 查看详情