C 值型別 引用型別及ref out的使用

2021-08-21 08:28:34 字數 2417 閱讀 3980

1.值型別

c#的所有值型別均隱式派生自system.valuetype:

結構體:struct(直接派生於system.valuetype);

數值型別:

整型:sbyte(system.sbyte的別名),short(system.int16),int(system.int32),long(system.int64),byte(system.byte),ushort(system.uint16),uint(system.uint32),ulong(system.uint64),char(system.char);

浮點型:float(system.single),double(system.double);

用於財務計算的高精度decimal型:decimal(system.decimal);

bool型:bool(system.boolean的別名);

使用者定義的結構體(派生於system.valuetype);

列舉:enum(派生於system.enum);

可空型別(派生於system.nullable泛型結構體,t?實際上是system.nullable的別名)。

可以用type.isvaluetype屬性來判斷乙個型別是否為值型別:

testtype testtype = new testtype ();

if (testtypetype.gettype().isvaluetype)

is value type.", testtype.tostring());

}

2.引用型別

c#有以下一些引用型別:

陣列(派生於system.array)

使用者用定義的以下型別:

類:class(派生於system.object);

介面:inte***ce(介面不是乙個「東西」,所以不存在派生於何處的問題。anders在《c# programming language》中說,介面只是表示一種約定[contract]);

委託:delegate(派生於system.delegate)。

object(system.object的別名);

字串:string(system.string的別名)。

引用型別和值型別都繼承自system.object類。不同的是,幾乎所有的引用型別都直接從system.object繼承,而值型別則繼承其子類,即 直接繼承system.valuetype。system.valuetype直接派生於system.object。即system.valuetype本身是乙個類型別,而不是值型別。其關鍵在於valuetype重寫了equals()方法,從而對值型別按照例項的值來比較,而不是引用位址來比較。

引用型別的物件總是在程序堆中分配(動態分配)。

可以看出:

引用型別與值型別相同的是,結構體也可以實現介面;

引用型別可以派生出新的型別,而值型別不能;

引用型別可以包含null值,值型別不能(可空型別功能允許將 null 賦給值型別);

引用型別變數的賦值只複製對物件的引用,而不複製物件本身。而將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。

ref和out

通過上面的講述我們可以知道,當值型別作為乙個方法的引數時,在方法內引數的改變並不能使此值型別資料發生改變,這裡也可以稱為值傳遞。使用引用型別作為乙個方法的引數時,在方法內引數的改變,會使此引用型別也改變,這裡也可以稱為引用傳遞。而ref和out的作用,就是使值傳遞變為引用傳遞。

ref和out的使用很簡單,在方法的引數列表中要引用傳遞的引數的資料型別前加ref或out,在呼叫此方法時也要在這些引數前加ref或out,下面我們看看例子:

static void main()
static void swop(int a,int b) static void swop1(ref int a,ref int b)

輸出結果:

a1b2

a2b1

從上面**可以看出沒加ref,是值傳遞,main方法裡的a和b並沒有改變,而加了ref後,變成引用傳遞,main方法裡的a和b也改變了。

static void main()

static void swop2(out int a,out int b)

我們再來看out的使用,可以看出,out和ref還是有很大區別的,在實際使用中,它們的作用其實也各有不同。

區別和作用

1.使用ref的引數必須在傳參之前初始化,而out可以在傳參前不初始化。

2.out指定的引數在進入函式時會清空自己,必須在函式內部賦初值。而ref指定的引數不需要。

3.ref一般用於需要方法內部對引數的改變使外面的資料也改變的情況,而out一般用於需要多個返回值時,使用out定義引數去接收返回值.

C 值型別和引用型別的引數傳遞(ref,out)

c 中有兩種型別,值型別,和引用型別。在記憶體中值型別是直接儲存在記憶體的棧中的,引用型別在棧中存放乙個位址,這個位址指向堆中的資料 引用型別的資料是存放在堆中的 下面我們來看看兩種型別引數傳遞有什麼區別 先看乙個例子 值型別的引數傳遞 class valueparms public void ad...

C 值型別,引用型別

2,引用型別 概念 值型別直接儲存其值,而引用型別儲存對其值的引用。引用型別 string,class,陣列 派生於system.array 委託 派生於system.delegate 介面。引用型別當宣告乙個類時,只在棧中分配一小片記憶體用於容納乙個位址,而此時並沒有為其分配堆上的記憶體空間。3,...

C 值型別與引用型別

1.主要內容 型別的基本概念 值型別深入 引用型別深入 值型別與引用型別的比較及應用 2.基本概念 c 中,變數是值還是引用僅取決於其資料型別。c 的基本資料型別都以平台無關的方式來定義,c 的預定義型別並沒有內置於語言中,而是內置於.net framework中。net使用通用型別系統 cts 定...