為了探明兩者區別,直接看**:
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...