【发布时间】:2015-02-14 20:14:46
【问题描述】:
对于一个类,ClassA,对象如何默认包含ToString()、GetHashCode()、GetType()方法。
如果 ChildClassA 是从 ClassA 继承的,那么基对象和子对象上的 GetType() 如何给出自己的实现结果。
这背后有什么魔力。
【问题讨论】:
标签: c#
对于一个类,ClassA,对象如何默认包含ToString()、GetHashCode()、GetType()方法。
如果 ChildClassA 是从 ClassA 继承的,那么基对象和子对象上的 GetType() 如何给出自己的实现结果。
这背后有什么魔力。
【问题讨论】:
标签: c#
所有不是从其他明确声明的类派生的类都派生自object,它具有您所询问的三种方法。是的,.GetType() 背后有一些魔力,它被定义为
[Pure]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
所以 .net 运行时有特殊的本地代码来处理它。
【讨论】:
.NET 中的任何类都继承自 object。要么是直接的,因为这是你创建类型时的默认设置,要么是间接的,因为你从另一个本身继承对象的类型继承。
ToString()、GetHashCode()和GetType()方法是为object定义和实现的,因此任何其他类型都继承它们。它们是virtual,因此任何其他派生类型都可以override 它们并在需要时使用它自己的实现。
【讨论】:
以前的答案很棒。我只是想稍微解释一下默认实现
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 可以获取对象的类型,因此很容易选择合适的散列算法。
所以你可以看到根本没有魔法
【讨论】: