保存引用类型时,栈中存放引用类型地址,地址指向堆中的实际值。
private int globalI = 1;
private int[] globalArr = new[] {1, 2, 3, 4};
private void Start()
{
Func1(globalI);
Debug.Log(globalI);
Func2(globalArr);
StringBuilder s = new StringBuilder();
foreach (int v in globalArr)
{
s.Append(v);
s.Append("-");
}
Debug.Log(s.ToString());
}
private void Func1(int i)
{
i = 10;
}
private void Func2(int[] arr)
{
arr[0] = 100;
arr = new [] {100, 100, 100};
}
返回结果:1 和 100-2-3-4-
传递参数是将栈中拷贝一份,所以Fuc1参数i是globalI的一个copy,Fuc2数组参数arr是栈
中globalArr的一份copy。
所以直接操作Func1中的i不会改变globalI,而操作的Func2的arr,相当于操作内存中的数组。所以数组第一个元素被改变了。
最后arr = new [] {100, 100, 100}将栈中这个变量指向了内存中新开辟的数组new [] {100, 100, 100}。
如果使用ref
Func2(ref globalArr);
StringBuilder s = new StringBuilder();
foreach (int v in globalArr)
{
s.Append(v);
s.Append("-");
}
private void Func2(ref int[] arr)
{
arr[0] = 100;
arr = new [] {100, 100, 100};
}
此时返回的应该是:返回结果:100-100-100-
ref使得传递的将不是栈
的复制体而是globalArr,此时执行 arr = new [] {100, 100, 100}, 将使得栈中
globalArr指向new [] {100, 100, 100}数组。