C#參考型別: 按值傳遞,按引用傳遞的對比

來源:互聯網
上載者:User
1,按值傳遞

值按值傳遞,參考型別按值傳遞的實質的是傳遞值,參數為實值型別時,“值”為執行個體本身,因此傳遞的是執行個體拷貝,不會對原來的執行個體產生影響;參數為參考型別時,“值”為對象引用,因此傳遞的是引用地址拷貝,會改變原來對象的引用指向。
string是參考型別,string按值傳遞的效果與實值型別按值傳遞效果一樣,string在這裡比較特殊。
調用方法發生參數傳遞時,方法根據參數類型先在stack建立一個變數,然後將參數的值賦值給該變數。所以,實值型別與string類型傳遞執行個體不變,參考型別傳遞地址改變。但如果是按引用傳遞,則都是傳遞地址,執行個體的值都會發生改變。

2,按引用傳遞
按引用傳遞之ref和out,不管是實值型別還是參考型別,按引用傳遞必須以ref或者out關鍵字來修飾,ref要求傳遞之前的參數必須首先顯示初始化,而out不需要。也就是說,使用ref的參數必須是一個實際的對象,而不能指向null;而使用out的參數可以接受指向null的對象,然後在調用方法內部必須完成對象的實體化。

實值型別按引用傳遞時,不會對實值型別裝箱。

按引用傳遞,傳遞的不是參數本身的值,而是參數的地址。如果參數為實值型別,則傳遞的是該實值型別的地址;如果參數為參考型別,則傳遞的是對象引用的地址,參考型別按引用傳遞結果和按值按引用傳遞一樣。

int i = 100;//Ref需要顯示初始化int j;//out不需要顯示初始化Fun(ref i,out j);void Fun(ref int i,out int j)    {        j = 100;//out必須完成對象的實體化    }

如下:

private void Awake()    {        SenderTest st = GetComponent<SenderTest>();//執行個體化類的對象        st.i = 100;        int i = 100;        string s = "100";        ChangeValue(i,s, st);//實值型別,參考型別,按值傳遞        print("value "+i+s+st.i);//value 100 100 200        ChangeValue(ref i, ref s, ref st);//實值型別,參考型別,按引用傳遞        print("ref "+i + s + st.i);//ref 200 200 200    }    void ChangeValue(int i, string s, SenderTest st)    {        i = 200;        s = "200";        st.i = 200;    }    void ChangeValue(ref int i, ref string s, ref SenderTest st)    {        i = 200;        s = "200";        st.i = 200;    }

相關文章:

使用C/C++編寫PHP Extension

【c#教程】C# 資料類型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.