C# 如何为C中的每个对象显示ToString()、GetHashCode()方法#
对于类ClassA,默认情况下对象如何包含ToString()、GetHashCode()、GetType()方法 若ChildClassA是从ClassA继承的,那个么基和子对象上的GetType()如何给出自己的实现结果呢C# 如何为C中的每个对象显示ToString()、GetHashCode()方法#,c#,C#,对于类ClassA,默认情况下对象如何包含ToString()、GetHashCode()、GetType()方法 若ChildClassA是从ClassA继承的,那个么基和子对象上的GetType()如何给出自己的实现结果呢 它背后有什么魔力。在.NET中的任何类都是从对象继承的。或者直接,因为这是创建类型时的默认值,或者间接地,因为您从另一个本身继承了对象的类型继承 方法ToString()、GetHashCode()和GetType()是为对象定义和实现的,因此任何其他类型都会继承它们。它
它背后有什么魔力。在.NET中的任何类都是从
对象继承的。或者直接,因为这是创建类型时的默认值,或者间接地,因为您从另一个本身继承了对象的类型继承
方法ToString()
、GetHashCode()
和GetType()
是为对象定义和实现的,因此任何其他类型都会继承它们。它们是虚拟的
,因此任何其他派生类型都可以重写它们,并在需要时使用它自己的实现。所有不是从其他明确声明的类派生的类都派生自对象
,该对象具有您所询问的三种方法。是的,在.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种默认哈希算法:对于引用类型,对于仅包含值类型的值类型或结构(fast),对于包含引用类型的结构(slow)。由于使用GetType()
CLR可以获取对象的类型,因此很容易选择合适的哈希算法
因此,正如您所看到的,根本没有魔法相关: