深入C#數據類型小部分第二章,
值類型和引用類型
C#的值類型包括:結構體(數值類型,bool型,用戶定義的結構體),枚舉,可空類型。
C#的引用類型包括:數組,用戶定義的類、接口、委托,object,字符串。
數組的元素,不管是引用類型還是值類型,都存儲在托管堆上。
引用類型在棧中存儲一個引用,其實際的存儲位置位於托管堆。為了方便,本文簡稱引用類型部署在托管推上。
值類型總是分配在它聲明的地方:作為字段時,跟隨其所屬的變量(實例)存儲;作為局部變量時,存儲在棧上。
值類型在內存管理方面具有更好的效率,並且不支持多態,適合用作存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行為。
值類型和引用類型區別
每一個值類型都有一個獨立的內存區域保存自己的值,調用它的時候調用的是他的值,而應用類型調用的是內存中的地址
比如a1=18,這時候在內存中保存的是18,當把a1付給a2的時候,他們兩個應用的是同一個內存空間,a2的值會保存為a1的值,當把a2改為20是,應為a1和a2引用的是同一個所以a1也變成20了,這是引用類型,
值類型是當把a1付給a2時會為a2在開一塊新的空間保存a1的值。當把a2改成20時就會在a2的空間保存20,和a1就沒關系了
值方式參數傳遞
1、值參數(Value Parameter )
格式:方法名稱(參數類型 參數名稱[,參數類型 參數名稱])
2、引用參數(Reference Parameter )
格式:方法名稱(ref 參數類型 參數名稱[,ref 參數類型 參數名稱])
3、輸出參數(Out Parameter)
格式:方法名稱(out 參數類型 參數名稱[,out 參數類型 參數名稱])
二、值參數與引用參數及輸出參數的區別:
2.1 值參數中實參的值不隨形參值變更而變更;
形參與實參值互不影響,實參傳遞給形參時,堆棧中就為其分配另外一部分空間。這樣,兩個參數變更時而互不影響。
2.2 引用參數及輸出參數中實參的值會隨形參值變更而變更
(形參:在定義函數中指定的形參,在未出現函數調用時,它們並不占內存中的存儲單元.只有在發生函數調用時,函數中形參才被分配內存單元.在調用結束後,形參所占的內存單元也被釋放。調用時將實參的值賦绐形參);
引用參數與輸出參數中,實參在堆棧中分配空間。當實參傳遞給形參時,會將地址傳遞給形參,即傳送的時指針,這樣形參變更時,實參也會隨著變更。
三、引用參數與輸出參數區別:
3.1 使用ref與out參數時,方法中參數及調用參數都需要加Ref或out關鍵字
3.2 使用ref參數與out參數得到的結果是一樣的,區別是:ref在調用前需給調用方法中的參數賦初值。out在調用前不需給調用方法中的參數賦初值,參數在實際方法體中初始化。