c中值型別和引用型別的區別

2021-07-01 02:55:19 字數 3300 閱讀 9689

1樓:大野瘦子

1、速度上的區別

值型別訪問速度快,引用型別訪問速度慢。

2、用途上的區別

值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用。

3、**上的區別

值型別繼承自system.valuetype,引用型別繼承自system.object

4、位置上的區別

值型別的資料儲存在記憶體的棧中,引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的位址。

5、型別上的區別

值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。

6、儲存位置上的區別

值型別變數直接把變數的值儲存在堆疊中,引用型別的變數把實際資料的位址儲存在堆疊中,而實際資料則儲存在堆中。

例如:字串型別,而堆疊則用於儲存固定長度的資料,如整型型別的資料int(每個int變數佔用四個位元組)。

由資料儲存的位置可以得知,當把乙個值變數賦給另乙個值變數時,會在堆疊中儲存兩個完全相同的值;而把乙個引用變數賦給另乙個引用變數,則會在堆疊中儲存對同乙個堆位置的兩個引用,即在堆疊中儲存的是同乙個堆的位址。

在進行資料操作時,對於值型別,由於每個變數都有自己的值,因此對乙個變數的操作不會影響到其它變數;對於引用型別的變數,對乙個變數的資料進行操作就是對這個變數在堆中的資料進行操作,

如果兩個引用型別的變數引用同乙個物件,實際含義就是它們在堆疊中儲存的堆的位址相同,因此對乙個變數的操作就會影響到引用同乙個物件的另乙個變數。

2樓:匿名使用者

舉例:應用型別:

陣列(派生於system.array)

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

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

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

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

object(system.object的別名);

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

可以看出:

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

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

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

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

對於最後一條,經常混淆的是string。我曾經在一本書的乙個早期版本上看到string變數比string變數效率高;我還經常聽說string是引用型別,string是值型別,等等。

值型別 :

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的別名)。

每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值。

c# 支援兩種變數型別:

• 值型別 — 這些是內建的基本資料型別,例如 char、int、float等基本資料型別(string除外) 、列舉以及用 struct 宣告的使用者定義型別。

• 引用型別 — 從基本型別構造而來的類和其他複雜資料型別。如:類、介面、陣列和字串。這種型別的變數並不包含型別的例項,而只是包含對例項的引用。

值型別和引用型別的區別在於他們在記憶體中的儲存方式,值型別存貯在棧中,引用型別的記憶體單元中只存放物件的位址,而物件本身存貯在記憶體堆中。

值型別在記憶體中引用的時候會在堆疊中建立乙個全新的副本,而不是簡單的引用;而引用型別只是簡單的引用物件的位址。

3樓:風琬鈕若雲

1值型別。

定義時只有型別和變數名。沒有&符號的為值型別。表示本身的值。有自己的記憶體空間。可以不做初始化。

2引用型別。

定義時,型別

&變數名=另乙個變數名。

表示引用。自身沒有記憶體空間,使用初始化時的變數空間。是另乙個變數名的乙個別名。

引用在定義時必須初始化。

4樓:森振華星戊

你得到的結果還是一樣的確良20

和20student3.age

=18;

--->age=18;

student4

=student3;

--->student4=18;

student4.age

=20;

--->student4=20;

--->age=20先前那個age被替了

----->20,20

5樓:匿名使用者

不知道你學過c沒有,演過c的話就很好理解這個問題,引用相當於你在c裡面使用指標,

如:寫乙個函式的時候

public int fuction1(ref int a,ret int b)

public static main()

當你在function1中間把a,b變數的值改變後,main函式裡面的a,b 值也就改變了

成了a=2,b=3了

6樓:匿名使用者

它們的區別在於使用的記憶體位置不同:值型別資料儲存在棧上,而引用型別資料儲存在堆上。

值型別直接包含值,換言之,變數引用的位置就是值在記憶體中實際儲存的位置。

引用型別並不直接儲存值,它們儲存的是對乙個記憶體位置的引用(記憶體位址),要去那個位置才能找到真正的資料。

------------------《c#本質論》(essential c# 2.0)

值型別和引用型別的區別是什麼

1 不同的儲存物件 值型別變數儲存的是變數的值,直接儲存在棧記憶體中。引用型別變數儲存的是變數所在的記憶體位址,引用型別變數的實際資料儲存於託管堆,變數本身僅僅是乙個指向堆中實際資料的位址,儲存於棧記憶體中,通常是四個位元組。2 不同的儲存位置 引用型別reference儲存在託管堆上。棧的記憶體是...

值型別與引用型別的區別是什麼呢,「值型別」和「引用型別」的區別是什麼?

區別 1 值型別通常被分配在棧上,它的變數直接包含變數的例項,使用效率比較高。2 引用型別分配在託管堆上,引用型別的變數通常包含乙個指向例項的指標,變數通過該指標來引用例項。3 值型別繼承自valuetype 注意 而system.valuetype又繼承自system.object 而引用型別繼承...

請問C 中引用和指標的區別,C 中引用和指標的區別

c 引用與指標的比較 引用是c 中的概念,初學者容易把引用和指標混淆一起。一下程式中,n是m的乙個引用 reference m是被引用物 referent int m int n m n相當於m的別名 綽號 對n的任何操作就是對m的操作。所以n既不是m的拷貝,也不是指向m的指標,其實n就是m它自己。...