当引用变量可以通过引用传递时:
class Example
{
public string str="Demo";
public int[] intValues={1,3,4,5};
public static void StrPassing(string someStr)
{
string otherStr="Changed!";
someStr=otherStr;
}
public static void NumPassing(int[] a)
{
a[2] = 115;
}
}
static void Main(string[] args)
{
Example ex = new Example();
Example.StrPassing(ex.str);
Example.NumPassing(ex.intValues);
foreach (int i in ex.intValues)
{
Console.WriteLine(i);
}
Console.WriteLine(ex.str);
Console.ReadLine();
}
在传递引用时,
intValues[2]
的值将更改为115
。但是字符串“ str”(演示)的值未更改为“ Changed!”。这是什么原因?将其作为数组通过引用传递,而其他引用类型通过传递值?
最佳答案
您需要区分更改变量引用哪个对象和更改“对象的内容”。
在此代码中:
public static void StrPassing(string someStr)
{
string otherStr="Changed!";
someStr=otherStr;
}
...您正在更改
someStr
的值。您没有对someStr
最初引用的字符串进行任何更改。确实,您不能因为字符串是不可变的。 (如果它是StringBuilder
,则可以将长度设置为0,然后附加“已更改!”。)更改
someStr
的值无效,因为参数(ex.str
)是按值传递的。 (有问题的值是一个引用,但这并不意味着它已通过引用传递。)现在将其与以下代码进行比较:
public static void NumPassing(int[] a)
{
a[2] = 115;
}
在这里,您没有更改
a
的值-您正在更改a
引用的数组的内容。简而言之,除非使用
ref
/ out
,否则参数将按值传递-但对于引用类型,该值仅是引用。我有一个article on parameter passing,它会更详细地介绍所有这些内容。