【问题标题】:How ToString(), GetHashCode() methods appear for each object in C#C#中每个对象如何出现ToString()、GetHashCode()方法
【发布时间】:2015-02-14 20:14:46
【问题描述】:

对于一个类,ClassA,对象如何默认包含ToString()、GetHashCode()、GetType()方法。

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

这背后有什么魔力。

【问题讨论】:

标签: c#


【解决方案1】:

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

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

所以 .net 运行时有特殊的本地代码来处理它。

【讨论】:

    【解决方案2】:

    .NET 中的任何类都继承自 object。要么是直接的,因为这是你创建类型时的默认设置,要么是间接的,因为你从另一个本身继承对象的类型继承。

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

    【讨论】:

      【解决方案3】:

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

      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 可以获取对象的类型,因此很容易选择合适的散列算法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2020-10-08
        相关资源
        最近更新 更多