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

時間 2021-07-01 02:55:27

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)

C陣列為引用還是值型別?若是引用型別,下邊該怎樣理解

陽光的雷咩咩 這確實是比較難以理解的現象,網上查了一下,說什麼堆之類的規則,總的來說就是陣列內元素為引用,陣列本身不是 似乎有點牽強。如果你在函式和呼叫處都加上ref就是完全的物件引用。參考資料 朽木擼其芽 也許可以這樣理解,陣列是值型別,但是他的值是地址,所以你的change n 函式改變的是陣列...

c什麼是值型別什麼是引用型別,c 中什麼是值型別什麼是引用型別

一 資料型別在它自己的記憶體分配中儲存資料,則該資料型別就是 值型別 值型別包括 1 所有數字資料型別 2 boolean char和date 3 所有結構,即使其成員是引用型別 4 列舉,因為其基礎型別總是sbyte short integer long byte ushort uinteger或...

C 中基型別和型別的區別是什麼

資料不會丟失,我不太理解你這裡的丟失指的是丟失什麼?成員資訊還是成員資料引用型別不同的區別決定了不同的物件在方法表中不同的訪問許可權。注意 根據 明早3點起 可以這樣理解 先看a是一個2維陣列,理解2維陣列的關鍵就是理解它為一個包含元素為一維陣列的陣列,也就是說a m n 是一個有n個m型別元素的一...