免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
ReferenceEquals, == , Equals

ReferenceEquals, == , Equals

1. ReferenceEquals, == , Equals
Equals , == , ReferenceEquals都可以用于判斷兩個(gè)對(duì)象的個(gè)體是不是相等。

a) ReferenceEquals
ReferenceEquals是Object的靜態(tài)方法,用于比較兩個(gè)引用類型的對(duì)象是否是對(duì)于同一個(gè)對(duì)象的引用。對(duì)于值類型它總是返回false。(因?yàn)锽ox以后的對(duì)象總是不同的,hehe)

b) ==是一個(gè)可以重載的二元操作符,可以用于比較兩個(gè)對(duì)象是否相等。
對(duì)于內(nèi)置值類型,==判斷的是兩個(gè)對(duì)象的代數(shù)值是否相等。它會(huì)根據(jù)需要自動(dòng)進(jìn)行必要的類型轉(zhuǎn)換,并根據(jù)兩個(gè)對(duì)象的值是否相等返回true或者false。例如:

Int a = 100;
Double b =100;

If(a == b)
Console.WriteLine(“equal supports compare between different types!”);

上面這段程序?qū)?huì)輸出:
equal supports compare between different types!

而對(duì)于用戶定義的值類型,如果沒(méi)有重載==操作符,==將是不能夠使用的。例如:
Struct Userstruct1;
Userstruct1 a;
Userstruct1 b;

If(a == b)
Console.WriteLine(“can == reach this far?”)

上面的這段代碼是不能夠通過(guò)編譯的??梢酝ㄟ^(guò)重載使==作用于用戶定義的值類型。

對(duì)于引用類型,== 默認(rèn)的行為與ReferenceEquals的行為相同,僅有兩個(gè)對(duì)象指向同一個(gè)Reference的時(shí)候才返回true。但是.NET Framework中的類很多對(duì)==進(jìn)行了重載,例如String類的==與Equals的行為相同,判斷兩個(gè)字符串的內(nèi)容是否相等。所以在應(yīng)用中,對(duì)于 系統(tǒng)定義的引用類型建議不要使用==操作符,以免程序出現(xiàn)與預(yù)期不同的運(yùn)行結(jié)果。

c) Equals 作為Object內(nèi)置方法,Equals支持對(duì)于任意兩個(gè)CTS對(duì)象的比較。
Equals它有靜態(tài)方法和可重載的一個(gè)版本,下面的程序片斷解釋了這兩個(gè)方法的用法,

int a = 5;
int b = 5;

If(Object.Equals(a ,b))
// you can also use if(a.Equals(b))
{
Console.WriteLine(“a is equal to b”);
}

事實(shí)上,這兩個(gè)版本的結(jié)果完全相同,如果用戶重載了Equals,調(diào)用的都是用戶重載后的Equals。Equals的靜態(tài)方法的好處是可以不必考慮用于比較的對(duì)象是否為null。

Equals方法對(duì)于值類型和引用類型的定義不同,對(duì)于值類型,類型相同,并且數(shù)值相同(對(duì)于struct的每個(gè)成員都必須相同),則Equals返回 true,否則返回false。而對(duì)于引用類型,默認(rèn)的行為與ReferenceEquals的行為相同,僅有兩個(gè)對(duì)象指向同一個(gè)Reference的時(shí) 候才返回true??梢愿鶕?jù)需要對(duì)Equals進(jìn)行重載,例如String類的Equals用于判斷兩個(gè)字符串的內(nèi)容是否相等。

StringBuilder a = new StringBuilder();
a.Append("the test a");
String s1 = a.ToString();
String s2 = "the test a";

if (s2 == s1)
Console.WriteLine("== returns true");

if (Object.Equals(s2, s1))
{
Console.WriteLine("equals returns true");
}

if (Object.ReferenceEquals(s2, s1))
{
Console.WriteLine("ReferenceEquals returns true");
}

這個(gè)實(shí)例將輸出:
== returns true
equals returns true

注:對(duì)于String類,直接聲明s1 = “the test a”的話,輸出結(jié)果將包含 "ReferenceEquals returns true",
因?yàn)槟J(rèn)的,String對(duì)于聲明的相同的字符串在堆上只保留一個(gè)Copy,所以s1與s2將會(huì)指向相同的Reference

在C#中,有多種比較方法,有referenceequal,equals,equalsto,但他們之間是有細(xì)微差別的。

referenceequal的實(shí)例

class MyClass {

   static void Main() {
      object o = null;
      object p = null;
      object q = new Object();

      Console.WriteLine(Object.ReferenceEquals(o, p));
      p = q;
      Console.WriteLine(Object.ReferenceEquals(p, q));
      Console.WriteLine(Object.ReferenceEquals(o, p));
   }
如果要是對(duì)象都指向空引用,那么它返回true,另外,p=q;這個(gè)賦值語(yǔ)句,對(duì)于值類型來(lái)說(shuō),只是把地址復(fù)制給了p,并沒(méi)有深拷貝。所以當(dāng)比較引用時(shí),返回true。如果比較o.equals(p),那么編譯器會(huì)報(bào)錯(cuò),因?yàn)閑quals方法不能比較null的情況。正因?yàn)槿绱耍瑀eferenceequals方法才不受開(kāi)發(fā)人員歡迎。另外,equals為實(shí)例的虛方法,referenceequals為靜態(tài)方法?;愋偷模剑剑褪遣僮鞣剌d,使用的 equals方法判等。當(dāng)然,還有一個(gè)equals的靜態(tài)方法,靜態(tài)equals與實(shí)例equals方法的唯一區(qū)別是:實(shí)例equals在對(duì)2個(gè)進(jìn)行比較時(shí),如果有一個(gè)為null,或者都是null,就會(huì)拋出異常,但靜態(tài)equals方法不會(huì),靜態(tài)equals方法首先對(duì)2者檢查是否為null,如果有為null的情況,就返回false,如果沒(méi)有null,那么就調(diào)用實(shí)例equals方法來(lái)進(jìn)行比較。

memberwiseclone()翻譯為成員智能復(fù)制,呵呵,為啥智能,我就講講。智能就在它區(qū)別對(duì)待值類型和引用類型。

MemberwiseClone 方法創(chuàng)建一個(gè)淺表副本,方法是創(chuàng)建一個(gè)新對(duì)象,然后將當(dāng)前對(duì)象的非靜態(tài)字段復(fù)制到該新對(duì)象。如果字段是值類型的,則對(duì)該字段執(zhí)行逐位復(fù)制。如果字段是引用類型,則復(fù)制引用但不復(fù)制引用的對(duì)象;因此,原始對(duì)象及其復(fù)本引用同一對(duì)象。

例如,考慮一個(gè)名為 X 的對(duì)象,該對(duì)象引用對(duì)象 A 和 B。對(duì)象 B 又引用對(duì)象 C。X 的淺表副本創(chuàng)建一個(gè)新對(duì)象 X2,該對(duì)象也引用對(duì)象 A 和 B。與此相對(duì)照,X 的深層副本創(chuàng)建一個(gè)新對(duì)象 X2,該對(duì)象引用新對(duì)象 A2 和 B2,它們分別是 A 和 B 的副本。B2 又引用新對(duì)象 C2,C2 是 C 的副本。

關(guān)于深拷貝和淺拷貝,深拷貝就是創(chuàng)建一個(gè)一摸一樣的對(duì)象,淺拷貝的話仍然是同一個(gè)對(duì)象,但是卻有2個(gè)計(jì)數(shù)器,2個(gè)強(qiáng)引用指向它。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
條款9:理解幾個(gè)相等判斷之間的關(guān)系
?。。。# 字符串詳解?。。。?!
你真的徹底了解值類型/引用類型,裝箱/拆箱,Object類嗎?
C# Object Equals 簡(jiǎn)介1
LilianChen C#:Equals, ReferenceEquals與==的區(qū)別
c#中什么是類和對(duì)象
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服