C 值型別與引用型別在使用上的區別

2021-06-19 18:26:28 字數 2355 閱讀 8513

為了探明兩者區別,直接看**:

public class object_1

set

}private string m_namr;

public string name

set }}

public struct struct_1

set

}private string m_namr;

public string name

set }}

在上面我們定義了乙個類(object_1)和乙個結構體(struct_1)。我們都知道類是引用型別,而結構體是值型別,所以接下來進行對比,我們讓兩者在change()方法中改變值:

private void form1_load(object sender, eventargs e)

public void change(object_1 obj_1, struct_1 stru_1)

得到結果:

可以發現,obj.age與obj.name的值發生了改變,但是stru.age與stru.name的值依然與之前一樣。

在change()方法內部obj_1與stru_1的值都被改變,但是為什麼在執行完change()之後卻出現差異。那可以設想為我們所改變的stru_1實際上不是真正的源引數。查詢資料後得知:

那是因為在change()方法內部obj_1被視為與傳進obj引數是乙個物件,而stru_1只是將引數stru的值copy了乙份。所以我們在內部修改stru_1的值只是修改了這個「替身」的值,本體的值並未修改。

所以也可以得出結論:

值型別在方法體內作為引數被時,只是將值copy乙份使用,因而對其所做操作都無法對源引數產生影響。

引用型別在方法體內被作為引數時,內部物件與引數物件一致,對其所做的操作會影響到源引數。

ps:int型,long型,char型等資料型別都是struct,所以符合我們上面的結論。

繼續深入:

有時,我們也希望能將值型別像引用型別一樣使用,比如在方法內修改值型別也影響源引數。

private void form1_load(object sender, eventargs e)

public void change(object_1 obj_1, ref struct_1 stru_1)//此處被修改

結果如下:

stru.age與stru.name的值發生了變化。這也達到了我們需求,值型別也可以像引用型別一樣使用。

但是原因是什麼?

剛剛我們說的都是改變值,若是將new物件呢?繼續修改上面change()方法**如下:

public void change(object_1 obj_1, ref struct_1 stru_1)

結果如下:

由於在change()內obj_1物件被new了,所以新物件的「簽名」與源引數的「簽名」已經不同,所以方法內部值的改變不影響原來的物件。如果要使new物件影響源引數,依然可以使用ref。

public void change(ref object_1 obj_1, ref struct_1 stru_1)

有人說string型別是特殊的引用型別,因為它與值型別一樣在方法內部改變後無法影響原引數,為了驗證,繼續修改**如下:

private void form1_load(object sender, eventargs e)

public void change(ref object_1 obj_1, ref struct_1 stru_1, string str)//此處被修改

結果如下:

表面上str的值沒有改變,依然是「a」。但是不要只看表面,之所以依然顯示為「a」,,是因為在這裡string=運算子實際上等同於str=new string(new char);也就是new了乙個新物件, 那str的「簽名」也自然就與源引數不同,也就不會影響源引數(與 obj_1 = new object_1()是同樣的道理)。

C 值型別與引用型別

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

c 引用型別與值型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。在c 中函式傳值的特點 1.對於複雜的資料型別,按引用傳遞的效率更高,因為在按值傳遞時,必須複製大量的資料 2.除非特別指定,所有的引用型別都...

C 值型別與引用型別

資料型別分為 值型別 引用型別 值型別 int char double bool 結構 struct 列舉 enum 儲存在堆疊中 引用型別 類 string。陣列 介面 儲存在託管堆中 2.值型別 變數儲存物件的值,賦值會建立值的副本,修改任何乙個副本,不會影響其他的 副本 int x 5 int...