对于类ClassA,默认情况下该对象如何包含ToString(),GetHashCode(),GetType()方法。
如果ChildClassA继承自ClassA,那么base和child对象上的GetType()如何给出自己的实现结果。
背后是否有任何魔力。
答案 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.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种默认的散列算法:对于引用类型,对于包含仅值类型(快速)的值类型或结构,对于包含引用类型(慢)的结构。由于使用GetType()
CLR可以获取对象类型,因此很容易选择适当的散列算法。
所以你可以看到根本没有魔法