如何为C#中的每个对象显示ToString(),GetHashCode()方法

时间:2015-02-14 20:14:46

标签: c#

对于类ClassA,默认情况下该对象如何包含ToString(),GetHashCode(),GetType()方法。

如果ChildClassA继承自ClassA,那么base和child对象上的GetType()如何给出自己的实现结果。

背后是否有任何魔力。

3 个答案:

答案 0 :(得分:2)

.NET中的任何类都继承自object。直接,因为它是您创建类型时的默认值,或者是间接因为您继承自己继承对象的另一个类型。

ToString()定义并实施了方法GetHashCode()GetType()object,因此任何其他类型都会继承它们。它们是virtual,因此任何其他派生类型都可以override它们,并在需要时使用它自己的实现。

答案 1 :(得分:1)

所有未从其他明确声明的类派生的类派生自object,它具有您要询问的三种方法。是的,.GetType()背后有一些魔力,它被定义为

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

因此.net运行时具有特殊的本机代码来处理它。

答案 2 :(得分:1)

以前的答案很棒。我只想稍微解释一下默认实现

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种默认的散列算法:对于引用类型,对于包含仅值类型(快速)的值类型或结构,对于包含引用类型(慢)的结构。由于使用GetType() CLR可以获取对象类型,因此很容易选择适当的散列算法。

所以你可以看到根本没有魔法