gpt4 book ai didi

c# - 从方法 C# 返回数组

转载 作者:行者123 更新时间:2023-12-05 09:28:39 35 4
gpt4 key购买 nike

我一直在想,为什么我的方法不是修改数组,当我将它用作参数并使它等于另一个具有不同值的数组时,在方法内部?我只是在更改引用地址吗?

    static void Main()
{
string[] array = { "yes", "no", "maybe" };
TestO(array); // Still "yes", "no", "maybe"
}

static void TestO(string[] array)
{
string[] secondArray = new string[array.Length];
secondArray[0] = "1";
secondArray[1] = "2";
secondArray[2] = "3";
array = secondArray;
}

我的猜测:我没有在 Main() 中修改数组,因为在 Test0() 方法中执行 array = secondArray; 时,我只是将array的引用地址改成了secondArray

如果我的猜测不对,我的问题是,为什么它没有被修改?

(我知道我可以将 Test0() 修改为 string[] 返回方法并返回修改后的 secondArray 并将其传递到 Main()) 中的 array

另一个问题是:如果我使用 string[] 返回方法,并声明如下:

        static void Main()
{
string[] array = { "yes", "no", "maybe" };
array = TestO(array);
}

static string[] TestO(string[] methodArray)
{
string[] secondArray = new string[methodArray.Length];
secondArray[0] = "1";
secondArray[1] = "2";
secondArray[2] = "3";
return secondArray;
}

array = TestO(array); 我只是将 secondArray[] 的引用地址传递给 array[] 还是我只传递值吗? (很可能是引用地址,但我想确定是否弄错了)

最佳答案

I just changed the reference address of array to secondArray. If my guess is not right, my question is, why exactly is it not getting modified?

我认为您倾向于理解内存中有两个对一个数据的引用(没有两个数据);你有一个指向数据的变量array。您调用一个方法,另一个方法,复制引用建立到相同的数据。您创建了一个新对象,然后将复制的引用指向新对象,将原始引用指向原始数据,然后您丢弃了复制引用和新数据。您又回到了完全相同的情况开始于。

从图形上看,一行一行,它可能看起来像(我将你的方法参数重命名为 arrayX 所以区别很明显):

enter image description here

如果用 ref 修饰参数并用 ref 调用它,则没有副本,因此被调用的方法可以修改原始引用并将其指向其他地方:

enter image description here

请注意,在这些情况的任一种中,都完全有可能修改数组的内容。正在做:

arrayX[0] = "New data";

..将在任一情况下生效并且打印array[0] 将显示“新数据”。修改箭头末端的数据时,起点是原始引用还是副本并不重要。这纯粹是关于方法是否有权将传递给它的原始引用指向另一个对象

通常我们这样做。我们采用您的第二个代码块的样式 - 返回数据。将其视为粗鲁可能会有所帮助 - 想象一下您的 friend 说他会在您度假时照看您的植物;你把 key 给了你的 friend 。他把你的植物换成他更喜欢的另一种植物;你很沮丧,因为你拥有那株植物十年了..

使用ref 或相关的“覆盖引用的能力”- out 的理由很少。不要将它用于“我想从我的方法中返回多个东西”——在面向对象的世界中,我们总是可以返回一个代表两项数据的东西。我们不需要“返回两个东西”;我们可以返回一个里面有两个东西的东西......

//don't:
void GetPerson(ref string name, ref int age)

//consider a class:
Person GetPerson()
return new Person(){ Name = ..., Age = ...}

//or a Tuple
(string Name, int Age) GetPerson

让调用方法选择是否应该覆盖它自己的变量,而不是让一些“第三方”把地毯从它脚下拉下来

关于c# - 从方法 C# 返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71196858/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com