gpt4 book ai didi

c# - 代码如何通过引用传递?

转载 作者:行者123 更新时间:2023-11-30 19:22:09 26 4
gpt4 key购买 nike

在main内部,我声明了一个本地int []数组(int [] nums)。我没有通过引用。
 但是当我打印局部数组的值时,我得到每个元素的平方值。
 是什么原因呢?

delegate void tsquare(int[] a);

static void Main()
{
int[] nums = { 1, 2, 3 };
tsquare sqr = new tsquare(SomeClass.Square);
sqr(nums);

foreach (int intvals in nums)
{
Console.WriteLine(intvals);
}
}


class SomeClass
{

public static void Square(int[] array)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = array[i] * array[i];
}
}

}


更新:

我向所有人致意。我最坚强的是int [] {Array}是一种值类型,委托完成了
现在可以从您的答案中了解到数组是引用类型。

最佳答案

这里有两个概念。


引用类型与值类型
按值传递与按引用传递


让我们先解决第二个问题。

通过值传递内容意味着您可以为方法提供自己的该值的副本,并且可以随意更改该值,而这些更改不会泄漏回到调用该方法的代码中。

例如,这:

Int32 x = 10;
SomeMethod(x); // pass by value


在这种情况下,在调用返回之后,x不可能是10以外的任何值,因为无论SomeMethod对值的副本执行什么操作,它都只会对自己的值执行操作。

但是,通过引用传递意味着我们并没有真正赋予该方法自己的值来使用,而是给了它我们自己的值所在的内存位置,因此该方法对该值所做的任何操作都会被反映回来。对我们的代码来说,因为实际上,只有一个价值在起作用。

所以这:

Int32 x = 10;
SomeMethod(ref x); // pass by reference


在这种情况下,x在SomeMethod返回之后可能会保持与调用之前不同的值。

因此,这是通过值传递还是通过引用传递。

现在弄乱了水域。还有另一个概念,引用类型与值类型,这使很多人感到困惑。您的问题也暗示您也对该问题感到困惑,如果没有,我深表歉意。

引用类型实际上是两部分。它是参考,也就是参考所指的内容。想一想您知道地址的房子。您在一张纸上写地址实际上并没有把整个房子都放在那张纸上,而是在纸上有对该特定房子的“引用”。

.NET中的引用类型是一回事。内存中的某个地方有一个对象,它是一组值,被分组在一起。您存储在变量中的该对象的地址。将此变量声明为引用类型的类型,这允许此两部分处理。

关于引用类型的好处是,您可能对同一个实际对象有很多引用,因此,即使在周围复制引用,内存中仍然只有一个对象。

编辑:关于问题,数组是引用类型。这意味着您的变量仅保存实际数组的地址,并且该数组对象位于内存中的其他位置。

但是,值类型是一回事,整个值是“值类型”的一部分,当您制作该值的副本时,会创建不同的副本

这是值类型的示例:

struct SomeType
{
public Int32 Value;
}

SomeType x = new SomeType;
x.Value = 10;
SomeType y = x; // value type, so y is now a copy of x
y.Value = 20; // x.Value is still 10


但是,对于引用类型,您不会复制它所引用的对象,而只是对其进行引用。可以将其想像成将房子的地址复制到第二张纸上。您仍然只有一间房子。

因此,只需将SomeType的类型更改为引用类型(将 struct更改为 class):

class SomeType
{
public Int32 Value;
}

SomeType x = new SomeType;
x.Value = 10;
SomeType y = x; // reference type, so y now refers to the same object x refers to
y.Value = 20; // now x.Value is also 20, since x and y refer to the same object


现在是最后一件事了;通过值传递引用类型。

采取这种方法:

public void Test(SomeType t)
{
t.Value = 25;
}


给定上面我们的SomeType的类版本,这里拥有的是一个采用引用类型参数的方法,但是将其作为通过值传递的方法。

这意味着Test无法将 t更改为完全引用另一个对象,并使该更改泄漏回调用代码。可以认为这是在打电话给朋友,并给他您在纸上的住址。无论您的朋友对那所房子做什么,您在纸上的住址都不会改变。

但是,该方法可以自由修改所引用对象的内容。在那种房子/朋友的情况下,您的朋友可以自由地去那所房子,并重新布置家具。由于只有一所房子在玩,如果您在他重新整理房子后去那所房子,您会看到他的变化。

如果更改方法以通过引用传递引用类型,则该方法不仅可以自由地重新排列所引用对象的内容,而且还可以自由地用全新对象替换该对象,并进行更改反映回调用代码。基本上,您的朋友可以告诉您“从现在开始,请使用我会给您的这个新地址代替旧地址,而完全忘记旧地址”。

关于c# - 代码如何通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614928/

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