返回一个数组在 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 中的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;

【讨论】:

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

以上是关于返回一个数组在 C# 中操作原始值的主要内容,如果未能解决你的问题,请参考以下文章

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

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

常用数组字符串方法总结&获取元素DOM操作

dup 和 clone 都返回不同的对象,但是修改它们会改变原始对象

检查值是不是在数组中(C#)

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