關於string是值型別還是引用型別

2021-04-18 14:27:15 字數 1044 閱讀 7981

當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點:

判斷相等性時,是按照內容來判斷的,而不是位址

它肯定是乙個引用型別沒錯,兩個方面來看:

1. class string繼承自object,而不是system.valuetype(int32這樣的則是繼承於system.valuetype) 2. string本質上是個char,而array是引用型別,並且初始化時也是在託管堆分配記憶體的

微軟設計這個類的時候估計是為了方便操作,所以重寫了操作符和equals方法,不然的話我們判斷string相等得這樣:

foreach(char c in s.tochararray())

但是另外乙個常用的物件微軟卻沒有幫忙重寫等值判斷的方法:array

這樣int a = 和int b = ,a == b?// false

還有乙個容易搞錯的地方是按引用傳遞還是按值傳遞的問題:

引用型別按引用傳遞,值型別按值傳遞,這些都不錯。 乙個引用型別,比如system.array類,作為引數向乙個方法傳遞時,傳送的是指標,但是這兩種**是不是就意味著等效?

void test(array a)和void test(ref array a)

結果是並不完全等效。

如果在函式內部呼叫建構函式新建了物件並賦予引數,則函式外的變數不會受影響; 比如a = new ...

如果只是改動該引數(乙個物件)的字段,則會有影響,此時加不加ref都是等效的。 比如a[i] = ...

而string型別的另外乙個特殊性在於它是「不會變」的,每次操作string,都相當於新建了乙個string物件,所以對於string來講,void test(string s)和void test(ref string s)永遠都是不一樣的。在這裡string再次表現出了值型別的特點,我們以為這是傳值 - 實際上傳送的還是位址,但是在操作的時候string被再次初始化,外部根本不能得到這個變化。

對於變數作用域的概念來講,微軟這麼設計也是合理的:既然是函式內部建立的物件,外部就應該沒有訪問這個物件的能力,函式結束後,這些物件就會被gc收集,同樣不會影響外面的程式。

關於string是值型別還是引用型別

當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點 判斷相等性時,是按照內容來判斷的,而不是位址 它肯定是乙個引用型別沒錯,兩個方面來看 1.class string繼承自object,而不是system.valuetype int32這樣的則是繼承於system.val...

String是值型別還是引用型別(C )

msdn 中明確指出 string 是引用型別而不是值型別,但 string 表面上用起來卻像是值型別,這又是什麼原因呢?首先從下面這個例子入手 值型別 int a 1 int b a a 2 console.writeline a is b is a,b 引用型別 string str1 ab s...

string 值型別還是引用型別

大家先來看一下下面的 吧!1using system 2using system.collections.generic 34 public class myclass5,a,s 12 1314 輸出的是abc,def 我們都知道陣列是引用型別的,請看一下段 1using system 2class...