ref 的使用。

1.ref 的使用。
void Function(ref p)
使用ref 傳參,是傳遞的地址。
public class RefTest : MonoBehaviour {
string p;
// Use this for initialization
void Start () {
p = "J";
Change(ref p); //這裏輸出“g” 如果去掉ref 輸出“J”。
print(p);
}
void Change(string _p)
{
_p = "g";
}

void Change(ref string _p)
{
_p = "g";
}
}
ref 傳遞的地址是引用的地址,即形參和引用會共用地址。對形參的操作即是對引用的操作。
如果不用ref ,相當於重新聲明瞭一個變量,指向了引用的值 的地址。
在代碼裏=均爲指向,故對”=形參 “的操作會將引用的值一直傳遞下去。如果執行“=形參”以外的操作,比如“形參=” 改變了形參的指向,就會丟失方法開始傳入形參的值的地址。這個操作對原引用不會有影響。但是方法裏面會丟失傳入的值。
2. 以上說法對於值類型比較好理解,但是對於引用類型容易引起混淆。 不過引用類型依舊按照這種規則。
容易混淆的地方是引用類型的複雜程度。比如自定義的類。
當我們創建一個類 比如
class People
{
public string Name;
public People(string s)
{
Name = s;
}
}
如果 執行
People p = new People("ss");
Change(p);
print(p.Name);
在Change 裏面如果我們執行
void Change(People _p)
{
_p.Name = "gg";
}
最後 print(p.Name);我們發現結果是“gg”; 就會有個疑問,按照上面的說法我們傳入的是P的值,對
_p的操作應該影響不了P的,但輸出的結果卻改變了。
那麼之所以會這樣是因爲錯覺。。。對,迷惑人的一直都是自己的錯覺。。
數值會改變是因爲我們改變了傳過來的值。。。就是這句
_p.Name = "gg";

我們其實改變的不是 _p,而是 _p.Name。 _p指向的值跟P指向的值是同一個值。 _p.Name我們已經從 _p的位置到了值的位置。

所以在寫代碼的時候一定要分清楚我們的方法到底是需要對什麼進行操作修改。來確定是否使用ref.






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章