C 值型別與類的不同

2022-04-23 17:13:52 字數 2546 閱讀 8059

關於值型別和引用型別的區別網上很多,可參考今天稍微總結一下,概念性的東西大體一說,c#的所有值型別均隱式派生自system.valuetype,需要注意system.valuetype確是一種引用型別,並且繼承system.object,而所有的引用型別均繼承system.object,值型別儲存在堆疊上而引用型別處處在託管堆。

結構是值型別,首先 new 在結構的使用有 類型別有所不同,

類型別使用new 是呼叫建構函式在託管堆分配記憶體儲存空間,返回其位址。而結構型別使用new 不會分配託管堆分配記憶體而是呼叫建構函式初始化字段。結構的建構函式要麼是有引數的,不可能是無引數,應為無引數是系統自己隱式新增的,就算有另外的建構函式,如果你顯示的宣告乙個無引數的建構函式在結構裡,將導致編譯錯誤。

結構的是值型別 儲存在棧中,值型別的變數即包括變數位址和變數內容所以可以直接像int ,double ..等使用,不要需要new 使用new 只是說可以方便一點初始化字段,但需要自己新增建構函式。

struct my

}my mytest=new my(10,10);

這樣mytest.x 和mytest.y 都初始化為10;

結構還可以這麼初始化

my mytest; 現在的mytest 資料值型別變數

mytest.x=xx;

而引用型別就不允許這麼做,引用型別儲存其位址,所以需要使用new返回位址及分配空間。

不能在結構中初始化字段,

比如struct my

將導致編譯錯誤,因為my現在屬於乙個資料型別,它不占用儲存空間,只有在定義變數的時候才能初始化使用

struct my

my mytest;

mytest.x=10;

int x;和my  mytest;

是一樣的道理

這的x、struct都是值型別的

我這裡介紹的值型別是大家平常不太關注的地方。

首先我們需要知道的是每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值。

比如int i = new int()<==> int32 i = new int32() <==> int i = 0<==>int32 i = 0;

使用new運算子時,將呼叫特定型別的預設建構函式並對變數賦以預設值.

這裡需要注意的是struct的new操作是不執行分配記憶體操作的(與class的new不同),

其new操作只執行初始化資料操作。

看乙個例子

int i = new int();

console.writeline(i);

然而,下面的**卻導致了編譯器錯誤 cs0165,因為它沒有使用 new,而且試圖使用尚未初始化的物件:

int i;

console.writeline(i);

再看using system;

using system.collections.generic;

using system.text;

namespace fanxing

.../**//*public address(string city, string province)

如果建立有參建構函式,必須對所有的域字段全部複製*/

//public address()

//public string city

...}

public string province

...}

public int zipcode

...}

}public class address1

...public address1()

...public string city

...}

public string province

...}

public int zipcode

...}

}console.write(address1.aaa);

//在這裡特意介紹下static建構函式的用法,

//不管是例項化還是呼叫靜態變數,靜態建構函式只呼叫一次,並且它先於非靜態建構函式前呼叫。

address1 b = new address1("a","b");

+ b.zipcode);//null + 0

console.read();}}

}同樣道理作為struct來講,必須通過new進行初始化,但是 structs 不能包含顯式預設建構函式,因為編譯器將自動提供乙個建構函式。此建構函式會將 struct 中的每個字段初始化為預設值(預設情況下,不管是類還是在結構當中clr會自動將值型別設為0,引用型別預設為null),只有當 struct 用 new 例項化時,才會呼叫此預設建構函式。

接下來注意這個問題:基於 structs 的物件(包括所有內建數值型別)可以初始化或賦值後使用,如下面的示例所示:

int a = 44;  // initialize the value type...

int b;

b = 33;      // or assign it before using it.

console.writeline(", ", a, b);也就是說對值型別呼叫預設建構函式不是必需的。

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...