[英]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.String
, ClassA
等)時,會在內存中創建從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.