out關鍵字引用對象

來源:互聯網
上載者:User

調用函數的時候,常常使用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");
}
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.