国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 父類(lèi)實(shí)現(xiàn)的 IEquatable<T> 接口,重寫(xiě)的相等性判斷函數(shù)都能被子類(lèi)繼承

這篇具有很好參考價(jià)值的文章主要介紹了C# 父類(lèi)實(shí)現(xiàn)的 IEquatable<T> 接口,重寫(xiě)的相等性判斷函數(shù)都能被子類(lèi)繼承。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

實(shí)驗(yàn)代碼

Son s1 = new(), s2 = new();

Console.WriteLine("_ = s1 == s2");
_ = s1 == s2;
Console.WriteLine();

Console.WriteLine("_ = s1 != s2;");
_ = s1 != s2;
Console.WriteLine();

Console.WriteLine("_ = s1.Equals(s2);");
_ = s1.Equals(s2);
Console.WriteLine();

Console.WriteLine("_ = ((object)s1).Equals(s2);");
_ = ((object)s1).Equals(s2);
Console.WriteLine();

Console.WriteLine("s1 is IEquatable<Father>");
Console.WriteLine(s1 is IEquatable<Father>);
Console.WriteLine();

Console.WriteLine("s1.GetHashCode()");
Console.WriteLine(s1.GetHashCode());
Console.WriteLine();

public class Father : IEquatable<Father>
{
	public virtual int A { get; set; }
	public virtual int B { get; set; }

	public override bool Equals(object? obj)
	{
		Console.WriteLine("object Equals");
		if (obj is not null and Father)
		{
			Father f = (Father)obj;
			return f.A == A && f.B == B;
		}

		return false;
	}

	public override int GetHashCode()
	{
		Console.WriteLine("GetHashCode");
		return 0;
	}

	public static bool operator ==(Father left, Father right)
	{
		Console.WriteLine("比較==");
		return left.Equals(right);
	}

	public static bool operator !=(Father left, Father right)
	{
		Console.WriteLine("比較!=");
		return !(left == right);
	}

	public bool Equals(Father? other)
	{
		Console.WriteLine("IEquatable Equals");
		return ((object)this).Equals(other);
	}
}

public class Son : Father
{
	public override int A { get => base.A; set => base.A = value; }
}

運(yùn)行結(jié)果

_ = s1 == s2
比較==
IEquatable Equals
object Equals

_ = s1 != s2;
比較!=
比較==
IEquatable Equals
object Equals

_ = s1.Equals(s2);
IEquatable Equals
object Equals

_ = ((object)s1).Equals(s2);
object Equals

s1 is IEquatable<Father>
True

s1.GetHashCode()
GetHashCode
0

在父類(lèi)重寫(xiě)的 Equals 方法,繼承的 IEquatable 接口,重寫(xiě)的 == ,!= 運(yùn)算符,重寫(xiě)的 GetHashCode 方法在子類(lèi)中仍然是表現(xiàn)為被重寫(xiě)的狀態(tài)。

子類(lèi)實(shí)現(xiàn) IEquatable 接口

現(xiàn)在讓子類(lèi)也實(shí)現(xiàn) IEquatable 接口

Son s1 = new(), s2 = new();

s1.Equals(s2);

public class Father : IEquatable<Father>
{
	public virtual int A { get; set; }
	public virtual int B { get; set; }

	public override bool Equals(object? obj)
	{
		Console.WriteLine("object Equals");
		if (obj is not null and Father)
		{
			Father f = (Father)obj;
			return f.A == A && f.B == B;
		}

		return false;
	}

	public override int GetHashCode()
	{
		Console.WriteLine("GetHashCode");
		return 0;
	}

	public static bool operator ==(Father left, Father right)
	{
		Console.WriteLine("比較==");
		return left.Equals(right);
	}

	public static bool operator !=(Father left, Father right)
	{
		Console.WriteLine("比較!=");
		return !(left == right);
	}

	public bool Equals(Father? other)
	{
		Console.WriteLine("IEquatable Equals");
		return ((object)this).Equals(other);
	}
}

public class Son : Father, IEquatable<Son>
{
	public bool Equals(Son? other)
	{
		Console.WriteLine("IEquatable<Son>.Equals");
		return ((object)this).Equals(other);
	}
}

運(yùn)行結(jié)果

IEquatable<Son>.Equals
object Equals

Equals 方法的重載

此時(shí)代碼提示如下
C# 父類(lèi)實(shí)現(xiàn)的 IEquatable<T> 接口,重寫(xiě)的相等性判斷函數(shù)都能被子類(lèi)繼承,c#,開(kāi)發(fā)語(yǔ)言
子類(lèi)實(shí)現(xiàn)接口后,調(diào)用的默認(rèn)就是子類(lèi)實(shí)現(xiàn)的 Equals 方法。也可以用強(qiáng)制轉(zhuǎn)換調(diào)用父類(lèi)的 Equals 方法
C# 父類(lèi)實(shí)現(xiàn)的 IEquatable<T> 接口,重寫(xiě)的相等性判斷函數(shù)都能被子類(lèi)繼承,c#,開(kāi)發(fā)語(yǔ)言
這里屬于 Equals 方法的不同類(lèi)型的重載。通過(guò) public override bool Equals(object? obj) 重寫(xiě)的 Equals 方法也是一種重載。這個(gè)重載是每一個(gè) object 的子類(lèi)都有的,不重寫(xiě)這個(gè)方法時(shí)比較的是兩個(gè)對(duì)象的引用是否相等。

所有判斷相等性的運(yùn)算符、方法必須一起重寫(xiě)

上面那些判斷相等性的方法、運(yùn)算符必須要么一起重寫(xiě),要么全部不重寫(xiě)。實(shí)現(xiàn)了 IEquatable 接口后也要重寫(xiě)全部。如果不全部重寫(xiě),這些不同的相等性判斷方法返回結(jié)果不一致會(huì)造成混亂。

對(duì)象放到哈希表的過(guò)程

對(duì)象在放到哈希表里首先是計(jì)算哈希值,然后嘗試放到哈希表中的對(duì)應(yīng)位置。如果該位置已經(jīng)有一個(gè)對(duì)象了,再調(diào)用 Equals 方法判斷是不是同一個(gè)對(duì)象,如果是,就不再放一次了。如果不是,則說(shuō)明發(fā)生了哈希沖突,此時(shí)會(huì)將新對(duì)象用鏈表掛在哈希表該位置。

重寫(xiě) Equals 方法后,如果將對(duì)象放在哈希表里,必須重寫(xiě) GetHashCode 方法

重寫(xiě)相等性判斷方法時(shí),如果想讓對(duì)象能夠在哈希表里正常工作,必須也重寫(xiě) GetHashCode 方法。GetHashCode 方法原本是根據(jù)引用值生成哈希碼,原本的相等性運(yùn)算也是根據(jù)引用值。這種情況可以正常工作。但是,如果重寫(xiě)了 Equals 方法,不重寫(xiě) GetHashCode 方法,會(huì)導(dǎo)致明明相等的兩個(gè)對(duì)象返回的哈希值不同(因?yàn)樗麄兊囊貌煌谑枪1碇械膬蓚€(gè)位置儲(chǔ)存了兩個(gè)相等的對(duì)象。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-603905.html

重寫(xiě) GetHashCode 的注意事項(xiàng)

  1. 不要使用會(huì)變化的字段生成哈希碼。因?yàn)樽侄巫兓?,生成的哈希碼不同,此時(shí)再調(diào)用 GetHashCode 方法得到的哈希碼不同,這會(huì)導(dǎo)致字段變化后無(wú)法在哈希表中找到該對(duì)象了。
  2. 兩個(gè)對(duì)象使用 Equals 方法判斷相等性返回 true 時(shí),GetHashCode 方法必須能夠返回相同的值。否則會(huì)導(dǎo)致兩個(gè)相等的對(duì)象具有不同的哈希值,這會(huì)導(dǎo)致哈希表中有重復(fù)的元素。

到了這里,關(guān)于C# 父類(lèi)實(shí)現(xiàn)的 IEquatable<T> 接口,重寫(xiě)的相等性判斷函數(shù)都能被子類(lèi)繼承的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【==是判斷相等嗎?---錯(cuò)辣】C++和JAVA中判斷字符串值相等的區(qū)別

    【==是判斷相等嗎?---錯(cuò)辣】C++和JAVA中判斷字符串值相等的區(qū)別

    參考文章:這里;這里;這里 C++中的 string 類(lèi)型可以使用 == 和 != 來(lái)判斷兩個(gè)字符串的值是否相等;而JAVA不行,JAVA中 == 和 != 是用來(lái) 判斷兩個(gè)字符串的地址是否相同 (或者說(shuō)是 對(duì)象是否相同 ,即 是否為同一個(gè)對(duì) 象)。 運(yùn)行結(jié)果 結(jié)果解釋 :C++中可以利用 == 來(lái)判斷兩個(gè)字符

    2023年04月21日
    瀏覽(27)
  • 判斷兩個(gè)數(shù)組是否相等

    在判斷兩個(gè)數(shù)組是否相等之前,我們應(yīng)該弄清楚數(shù)組怎樣才算相等,官方給的解釋是這樣的: Returns true if the two specified arrays of ints are equal to one another. Two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. In other

    2024年02月15日
    瀏覽(89)
  • Excel——TEXTJOIN函數(shù)實(shí)現(xiàn)某一列值相等時(shí)合并其他列

    Excel——TEXTJOIN函數(shù)實(shí)現(xiàn)某一列值相等時(shí)合并其他列

    一、TEXTJOIN函數(shù)介紹 公式=TEXTJOIN(分隔符, 忽略空白單元格, 字符串1…) 分隔符: 文本字符串,或者為空,或用雙引號(hào)引起來(lái)的一個(gè)或多個(gè)字符,或?qū)τ行谋咀址囊谩H绻峁┮粋€(gè)數(shù)字,則將被視為文本。 忽略空白單元格: 如果為 TRUE,則忽略空白單元格,如果是Fa

    2024年02月04日
    瀏覽(27)
  • MATLAB-判斷兩矩陣是否相等

    相等的位置返回1,不相等則返回0 相等返回1,不相等返回0 注意:矩陣不可以包含NaN,因?yàn)檫@個(gè)函數(shù)中,NaN~=NaN。

    2024年02月06日
    瀏覽(92)
  • 判斷兩個(gè)vector數(shù)組是否相等

    判斷兩個(gè)vector數(shù)組是否相等是可以直接使用==或者!=的 因?yàn)関ector內(nèi)部都進(jìn)行了相關(guān)運(yùn)算符的重載,還可以進(jìn)行比較大小 下面這道簡(jiǎn)單搜索題就用到了這個(gè)性質(zhì),淺看一下吧 【問(wèn)題描述】給定一個(gè)n個(gè)整數(shù)的集合X={x1,x2,…xn}(X中可能包含重復(fù)元素)和整數(shù)y,找出和等于y的X的子集

    2024年02月12日
    瀏覽(84)
  • java 判斷兩個(gè)List是否包含 判斷兩個(gè)list相等

    java 判斷兩個(gè)List是否包含 判斷兩個(gè)list相等 https://blog.51cto.com/u_12855/7333853 1、直接使用equals()比較 眾所周知,兩個(gè)列表具有完全相同的元素并且具有完全相同的順序時(shí),它們是相等的。因此, 如果我們業(yè)務(wù)要求兩個(gè)list順序一致,可以使用equals()方法進(jìn)行相等性檢查: 即使

    2024年02月04日
    瀏覽(132)
  • Js如何判斷兩個(gè)數(shù)組是否相等?

    Js如何判斷兩個(gè)數(shù)組是否相等?

    日常開(kāi)發(fā),時(shí)不時(shí)會(huì)遇到需要判定2個(gè)數(shù)組是否相等的情況,需要實(shí)現(xiàn)考慮的場(chǎng)景有: 先判斷長(zhǎng)度,長(zhǎng)度不等必然不等 元素位置 其他情況考慮 \\\'1\\\' 和 1 (Object的key是字符串, Map的key沒(méi)有限制) NaN null 和 undefined 數(shù)組自帶的方法,比較適合的有: every、some、filter、findIndex 。 這種

    2024年02月22日
    瀏覽(94)
  • 記錄--如何判斷兩個(gè)數(shù)組的內(nèi)容是否相等

    記錄--如何判斷兩個(gè)數(shù)組的內(nèi)容是否相等

    給定兩個(gè)數(shù)組,判斷兩數(shù)組內(nèi)容是否相等。 不使用排序 不考慮元素位置 例: 思考幾秒:有了???? 直接遍歷第一個(gè)數(shù)組,并判斷是否存在于在第二個(gè)數(shù)組中 求差集, 如果差集數(shù)組有長(zhǎng)度,也說(shuō)明兩數(shù)組不等(個(gè)人感覺(jué)比上面的麻煩就不舉例了) 細(xì)心的小伙伴就會(huì)發(fā)現(xiàn):N

    2024年02月08日
    瀏覽(848)
  • Go語(yǔ)言如何判斷兩個(gè)對(duì)象是否相等

    在編程中,判斷兩個(gè)對(duì)象是否相等是一項(xiàng)常見(jiàn)的任務(wù),同時(shí)判斷對(duì)象是否相等在很多情況下都非常重要,例如: 單元測(cè)試 :編寫(xiě)單元測(cè)試時(shí),經(jīng)常需要驗(yàn)證函數(shù)的輸出是否符合預(yù)期,這涉及到比較對(duì)象是否相等。 數(shù)據(jù)結(jié)構(gòu)操作 :在使用 map 等數(shù)據(jù)結(jié)構(gòu)時(shí),可能需要判斷兩個(gè)對(duì)

    2024年02月07日
    瀏覽(646)
  • 在JS中如何判斷兩個(gè)對(duì)象是否相等

    在JavaScript中,判斷兩個(gè)對(duì)象是否相等有多種方法,取決于你對(duì) 相等 的定義以及對(duì)象屬性的類(lèi)型。以下是幾種常見(jiàn)的方法: ? 1. 嚴(yán)格相等運(yùn)算符 (===) 使用 === 運(yùn)算符可以比較兩個(gè)對(duì)象是否引用同一個(gè)對(duì)象。如果兩個(gè)變量引用了同一個(gè)對(duì)象,則它們是相等的,否則它們是不相等

    2024年02月03日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包