在我看来,C# 的原始设计者将该功能命名为“ref”这一事实是一个坏主意。它会导致人们混淆引用类型和“ref”参数/返回。思考“ref”的更好方法是“别名”。也就是说,参考为您提供现有变量的另一个名称.
在你的程序中,byRef
是另一个名字arr[1]
不管是否arr[1]
是值类型或引用类型. If arr[1]
是一个字符串变量(记住,数组元素是变量;你可以改变它们) then byref
也是一个字符串变量,它是same具有不同名称的字符串变量。
注意arr
也是一个变量;如果你改变的值arr
, then byRef
不来搭便车。它仍然是同一数组的同一槽的别名,无论arr
.
所以当你说
ref var byRef = ref GetSpecialItem_New(arr); //gets back arr[1]
Then
byRef.Name = "byRef";
完全一样
arr[1].Name = "byRef";
当你说
byRef = new CoolClass("newByRef", 50);
这与
arr[1] = new CoolClass("newByRef", 50);
需要注意的是,如果你改变了arr
分配后byRef
,你仍然有一个别名original arr[1]
.
Again: byRef
is 只是另一种拼写方式arr[1]
,这样它总是使用的值arr
当它有byRef
被分配。它是not值类型或引用类型不同。
相比之下,byVal
不是别名arr[1]
。它是一个second变量有一个copy的内容arr[1]
。当您分配给byVal
你没有分配给arr[1]
。您正在分配给byVal
,这是一个不同的多变的。
The contents of arr[1]
is a 参考, 然后参考被复制到byVal
,完全独立的存储位置。