溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

引用類型和值類型的比較

發(fā)布時間:2020-07-07 09:46:25 來源:網(wǎng)絡(luò) 閱讀:413 作者:tanglehui_2005 欄目:編程語言
昨天寫代碼,不經(jīng)意就把引用類型和值類型比較的不同忘記了,有必要記下來提醒自己,以免以后犯一樣的錯誤.
先貼上自己寫的錯誤代碼
 
Object entryId ="entryid";
var result  =sourceDynamicObject.where  (o=>o.GetDynamicObjectItemValue<Object>("ParentEntryId")==entryId);
這個錯誤很明顯,引用類型的比較使用==,明顯reslut獲不到值。
C#有以下一些引用類型:
數(shù)組(派生于System.Array)
用戶用定義的以下類型:
類:class(派生于System.Object);
接口:interface(接口不是一個“東西”,所以不存在派生于何處的問題。Anders在《C# Programming Language》中說,接口只是表示一種約定[contract]);
委托:delegate(派生于System.Delegate)。
object(System.Object的別名);
字符串:string(System.String的別名)。
可以看出:
引用類型與值類型相同的是,結(jié)構(gòu)體也可以實現(xiàn)接口;
引用類型可以派生出新的類型,而值類型不能;
引用類型可以包含null值,值類型不能(可空類型功能允許將 null 賦給值類型);
引用類型變量的賦值只復(fù)制對對象的引用,而不復(fù)制對象本身。而將一個值類型變量賦給另一個值類型變量時,將復(fù)制包含的值。
對于最后一條,經(jīng)常混淆的是string。我曾經(jīng)在一本書的一個早期版本上看到String變量比string變量效率高;我還經(jīng)常聽說String是引用類型,string是值類型,等等。例如:
string s1 = "Hello, ";
string s2 = "world!";
string s3 = s1 + s2;//s3 is "Hello, world!"

這確實看起來像一個值類型的賦值。再如:
string s1 = "a";
string s2 = s1;
s1 = "b";//s2 is still "a"

改變s1的值對s2沒有影響。這更使string看起來像值類型。實際上,這是運算符重載的結(jié)果,當(dāng)s1被改變時,.NET在托管堆上為s1重新分配了內(nèi)存。這樣的目的,是為了將做為引用類型的string實現(xiàn)為通常語義下的字符串。

通過上面的介紹,下面的結(jié)果就很明顯

string s1= "abc";

string s2="abc";

String s3 = new String("abc");

String s4  =new String("abc");

s1==s2 true 

s3==s4  false

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI