【发布时间】:2011-08-25 09:12:21
【问题描述】:
在我的一生中,我浏览的每一个教程,我看过的每一个视频,我读过的每一本书,我都无法理解这些东西究竟是如何工作的。
我看到按值传递值、按引用传递值、按值引用、按引用传递。有人可以通过最基本的示例帮助我理解这些吗?
关于返回类型的同样问题。它们是如何工作的?
【问题讨论】:
标签: c# types parameters return
在我的一生中,我浏览的每一个教程,我看过的每一个视频,我读过的每一本书,我都无法理解这些东西究竟是如何工作的。
我看到按值传递值、按引用传递值、按值引用、按引用传递。有人可以通过最基本的示例帮助我理解这些吗?
关于返回类型的同样问题。它们是如何工作的?
【问题讨论】:
标签: c# types parameters return
您将在此找到的最佳资源是 Jon Skeet 的 Parameter passing in C#。它给出了非常明确的解释。如果在阅读后您仍有疑问,您应该尝试更具体地询问他们,以便更容易为您提供帮助。
【讨论】:
让我们稍微备份一下,从变量开始。
变量总是包含一些特定的信息。对于值类型,包含的信息直接是整个值。对于引用类型,包含的信息只是对实际值所在的其他一些内存位置的引用。
在 .Net 中,您可以假装变量仅以一种方式真正传递给函数或从函数返回:按值。现在忘记通过引用传递——它只会让事情变得混乱。当您按值传递变量时,变量直接持有的全部信息复制到函数中。诀窍在于理解这对引用类型意味着什么,那就是获取引用的副本。
我可以用一个简单的代码示例来演示:
void Test(int x, dynamic y)
{
x = 3;
y.a = "four";
y.b = "five";
y = new {a = "six", b = "seven"}; // this will have no effect outside the function
}
int x = 2; // value type
var y = new {a = "one", b="two"}; //reference type
// both x and y are passed by value, but y is a reference type so the reference itself is copied
Test(x, y);
Console.WriteLine(x); //writes 2, because the test function is working with a copy
Console.WriteLine(y.a); //writes four
Console.WriteLine(y.b); //writes five
在引用类型的情况下,您可以强制执行真正的“按引用传递”,但您永远不应该这样做,除非您真的知道发生了什么。看起来像这样:
void Test(ref dynamic y)
{
y = new {a = "three", b="four"};
}
var y = new {a = "one", b="two"};
Test(y);
Console.WriteLine(y.a); //prints one
Console.WriteLine(y.b); //prints two
输出仍然是“一”和“二”,因为函数替换了局部变量的引用。调用该函数的代码仍然具有对原始内存位置的引用,因此输出原始值。
【讨论】:
首先,您只看到按值传递或按引用传递。没有别的。 现在要理解这个概念,假设您有一组标记为 1、2、3、4 等的数字框。这些框包含一些数据。 然后想象你有一个陈述相同内容的论文列表,即具有 1、2、3、4 的索引。
现在您想将盒子的其中一个内容(数据)传递给您的朋友。 您可以通过以下两种方式之一进行操作。
按值传递 您的朋友检查您的盒子,并将其复制到他的盒子/硬盘中。假设您的朋友需要更改此数据。如果他这样做了,你原来的盒子不会受到影响,因为他改变了他盒子里的数据。
通过引用传递 您只需将盒子的地址提供给您的朋友,您的朋友就会使用您的盒子而不是复制它。如果他修改数据,它会从你的盒子里,你的原始数据会被改变。
在了解返回类型之前,您必须了解数据类型。从那里开始。
【讨论】: