調用函數的時候,常常使用out關鍵字修飾傳入的參數,這樣可以將輸出值放到參數中輸出。某種意義上,這很有點像C++語言中用&實現的“引用”或者用指標實現的資料傳遞。不過當參數是類的對象的時候,C#和C++相比就有了很大的不同。
C++中,如果傳入的參數是對象的指標,那麼該指標在執行個體化之前傳入,或者在被調用函數內部通過new語句被重新賦值,那麼往往會造成出錯,因為離開函數範圍以後(也就是被調用函數返回以後),你在被調用函數中定義的所有資料和對象原則上都會被回收,而返回的指標如果還是指向“不存在的對象”,則會造成種種不可預知的錯誤!所以,在C++使用引用或者“引用”傳遞對象的時候一定要考慮清楚。
C#中,如果參數湊巧是對象,那麼該對象在執行個體化之間就可以被調用;在調用的函數內部,C#要求一定要先將out修飾的參數執行個體化之後才能使用;從這個意義上說,最好在傳入的時候就不要執行個體化,因為這樣可以提高效率。
為什麼C++和C#差別這麼大?因為C#有“垃圾自動回收機制”,而C++就必須靠程式員自己管理記憶體了,如果水平不夠或者比較粗心或者不知道什麼理由忘記了一個小小的delete,“記憶體流失”就會像定時炸彈一樣不知什麼時候會把你炸得外焦裡嫩。因此C#程式員可以肆無忌憚地建立和使用對象,從不擔心記憶體片段問題;而C++程式員則遇到指標和new就如臨大敵戰戰兢兢,因為很可能開發時一分的不小心會導致後期十二分的辛苦修改。
代碼如下:
class Program
{
static void Main(string[] args)
{
outTestClass otc;
useClass uc = new useClass();
//使用out關鍵字,輸入參數如果是對象,可以不new,也可以new
uc.GetOutObjInfo(out otc);
Console.WriteLine(otc.GetStr());
}
}
class outTestClass
{
private string _strName;
public outTestClass()
{
_strName = "outTestClass";
}
public void SetStr(string str)
{
_strName = str;
}
public string GetStr()
{
return _strName;
}
}
class useClass
{
public void GetOutObjInfo(out outTestClass tc)
{
tc = new outTestClass();
tc.SetStr("User");
}
}