返回一个数组在 C# 中操作原始值
Posted
技术标签:
【中文标题】返回一个数组在 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 中的modified
和original
再次引用了 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;
【讨论】:
哇,非常感谢您抽出时间来写这个答案。非常感谢!我也尝试了你的解决方案,它对我帮助很大。不仅在代码中,而且在我对主题的理解中。以上是关于返回一个数组在 C# 中操作原始值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 regex.split 在 c# 中解析 html 并返回值数组