我很难理解传递值和传递参考之间的区别。有人可以提供说明差异的C#示例吗?
答案 0 :(得分:16)
一般情况下,请阅读my article about parameter passing。
基本理念是:
如果参数是通过引用传递的,那么对方法中参数值的更改也会影响参数。
细微的部分是,如果参数是引用类型,那么执行:
someParameter.SomeProperty = "New Value";
不是更改参数的值。该参数只是一个引用,上面的内容不会改变参数引用的内容,只会更改对象中的数据。以下是真正更改参数值的示例:
someParameter = new ParameterType();
现在举例:
简单示例:通过ref或值传递int
class Test
{
static void Main()
{
int i = 10;
PassByRef(ref i);
// Now i is 20
PassByValue(i);
// i is *still* 20
}
static void PassByRef(ref int x)
{
x = 20;
}
static void PassByValue(int x)
{
x = 50;
}
}
更复杂的示例:使用引用类型
class Test
{
static void Main()
{
StringBuilder builder = new StringBuilder();
PassByRef(ref builder);
// builder now refers to the StringBuilder
// constructed in PassByRef
PassByValueChangeContents(builder);
// builder still refers to the same StringBuilder
// but then contents has changed
PassByValueChangeParameter(builder);
// builder still refers to the same StringBuilder,
// not the new one created in PassByValueChangeParameter
}
static void PassByRef(ref StringBuilder x)
{
x = new StringBuilder("Created in PassByRef");
}
static void PassByValueChangeContents(StringBuilder x)
{
x.Append(" ... and changed in PassByValueChangeContents");
}
static void PassByValueChangeParameter(StringBuilder x)
{
// This new object won't be "seen" by the caller
x = new StringBuilder("Created in PassByValueChangeParameter");
}
}
答案 1 :(得分:5)
按值传递表示传递参数的副本。对该副本的更改不会更改原始文件。
通过引用传递意味着传递对原始文献的引用,对引用的更改会影响原文。
这不是特定于C#,它以多种语言存在。
答案 2 :(得分:0)
摘要是:
当您希望函数/方法修改变量时,将使用按引用传递。
不按时传递值。
答案 3 :(得分:-1)