簡體   English   中英

如何在C#中為每個對象顯示ToString(),GetHashCode()方法

[英]How ToString(), GetHashCode() methods appear for each object in C#

對於ClassA類,默認情況下對象如何包含ToString(),GetHashCode(),GetType()方法。

而且,如果ChildClassA從ClassA繼承,則基礎對象和子對象上的GetType()如何給出其自己的實現結果。

背后有魔術嗎?

.NET中的任何類均從object繼承。 直接創建是因為這是創建類型時的默認值,還是間接繼承是因為它是從本身繼承對象的另一種類型繼承而來的。

方法ToString()GetHashCode()GetType()是為object定義和實現的,因此任何其他類型都可以繼承它們。 它們是virtual因此任何其他派生類型都可以override它們,並在需要時使用其自己的實現。

不是從其他明確聲明的類派生的所有類都從object派生,該object具有您要詢問的三種方法。 是的, .GetType()背后有一些魔術,它定義為

[Pure]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();

因此,.net運行時具有特殊的本機代碼來處理它。

以前的答案很棒。 我只想解釋一下默認實現

的GetType()。 當JIT編譯器編譯某些類(例如System.StringClassA等)時,會在內存中創建從System.Type繼承的內部CLR結構。 我們稱其為類型對象。 它描述了一種類型(其名稱,字段,方法,屬性,基類,接口等)。 GetType()只是返回該類型對象作為類。

var a = new ClassA();
var type = a.GetType(); // will return type object that describes ClassA

toString()方法。 基本上這是一個虛擬方法,看起來像

public virtual string ToString()
{
    return GetType().FullName;
}

GetHashCode()方法。 這也是生成可靠哈希碼的虛擬方法。 進一步挖掘有3種默認的哈希算法:用於引用類型,用於值類型或僅包含值類型的結構(快速),用於包含引用類型(慢)的結構。 由於CLR可以使用GetType()獲取對象的類型,因此很容易選擇合適的哈希算法。

如您所見,根本沒有魔術

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM