Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为C中的每个对象显示ToString()、GetHashCode()方法#_C# - Fatal编程技术网

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

C# 如何为C中的每个对象显示ToString()、GetHashCode()方法#,c#,C#,对于类ClassA,默认情况下对象如何包含ToString()、GetHashCode()、GetType()方法 若ChildClassA是从ClassA继承的,那个么基和子对象上的GetType()如何给出自己的实现结果呢 它背后有什么魔力。在.NET中的任何类都是从对象继承的。或者直接,因为这是创建类型时的默认值,或者间接地,因为您从另一个本身继承了对象的类型继承 方法ToString()、GetHashCode()和GetType()是为对象定义和实现的,因此任何其他类型都会继承它们。它

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

若ChildClassA是从ClassA继承的,那个么基和子对象上的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可以获取对象的类型,因此很容易选择合适的哈希算法

因此,正如您所看到的,根本没有魔法相关: