今後爭取每兩天能更新一次。平日的誘惑太多,雙休只顧玩了,進度有點慢。 接上一講的,類型的安全性,留下了點小尾巴——比較對象的相等性。 C#有四種比較相等的方式:除了“==”運算符外,System.Object定義了3中方法:ReferenceEqual()方法和兩種Equals(); 1.首先是“= ...
今後爭取每兩天能更新一次。平日的誘惑太多,雙休只顧玩了,進度有點慢。
接上一講的,類型的安全性,留下了點小尾巴——比較對象的相等性。
C#有四種比較相等的方式:除了“==”運算符外,System.Object定義了3中方法:ReferenceEqual()方法和兩種Equals();
1.首先是“==”運算符:
對於值類型,“==”比較兩個值是否相等;而對於引用類型,“==”則是比較兩個對象的引用地址是否相同。這裡有個特例,就是string字元串類型,“==”是比較字元串的值而不是引用地址,這是因為系統重寫了“==“運算符。關於運算符的重載,後面一講會說。
2.ReferenceEqual()方法
ReferenceEqual()是靜態方法,用於比較兩個對象是否引用類的同一個實例,即引用自同一個記憶體中的地址。作為靜態方法,不能被重寫。如果兩個引用 引用自同一個對象實例,則返回true,否則返回false。
SomeClass s1 = new SomeClass();
SomeClass s2 = new SomeClass();
SomeClass s3 = s1;
bool b1 = ReferenceEquals(null, null);
bool b2 = ReferenceEquals(s1, s2);
Console.WriteLine(b1); //true
Console.WriteLine(b2); //false,創建了不同實例,引用地址不同
Console.WriteLine(ReferenceEquals(s1, s3)); //true,s1,32引用地址相同
Console.WriteLine(ReferenceEquals(1, 1)); //flse,因為不是比較數值,而是比較引用地址
註意點:
因為ReferenceEquals()是比較引用類型的,當執行值類型間比較時,會採取裝箱(上一講提到)操作,把值類型轉換為引用類型,所以會返回false。
bool b=ReferenceEquals(1,1); 會返回false值
3.虛擬的Equal()方法: Equals(Object)
說明:確定指定的 Object 是否等於當前的 Object。
因為是虛擬的方法,可以被重寫。類似於“==”運算符,支持比較值類型和引用類型,其中string被當作值類型比較
4.靜態的Equals()方法: Equals(Object,Object)
說明:確定指定的對象實例是否被視為相等。
關於Equals方法,書中也僅僅是簡單介紹了下,詳細解答可以參考MSDN文檔:http://msdn.microsoft.com/zh-cn/library/System.Object.Equals(v=vs.100).aspx,上面對Equals()的兩個方法有著詳細的介紹。
下一篇講,運算符的重載。
參考頁面:
http://www.yuanjiaocheng.net/CSharp/csharp-linq.html
http://www.yuanjiaocheng.net/CSharp/csharp-func.html
http://www.yuanjiaocheng.net/CSharp/csharp-action.html
http://www.yuanjiaocheng.net/CSharp/csharp-Predicate-delegate.html
http://www.yuanjiaocheng.net/CSharp/csharp-extension-method.html