为什么Object.GetType()是一个方法而不是一个属性?

Ser*_*ier 13 .net c# clr

从设计的角度来看,我想知道为什么.NET创建者选择System.Object.GetType()而不是System.Object.Type只读属性.

它只是一个(非常小的)设计缺陷还是存在背后的理由?任何灯都欢迎.

Mar*_*ris 17

如果你看一下Reflector中的GetType()声明,你会发现:

[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType(); 
Run Code Online (Sandbox Code Playgroud)

属性和外部的组合意味着该方法实际上是在.NET运行时本身内部的非托管代码中实现的.在GUID问题这篇文章进入进一步的细节.在确定如果在较低级别处理后确定类型会更快时,他们显然是出于性能原因而这样做了.

这导致了两个不将GetType方法实现为属性的原因.首先,您无法使用方法定义属性extern,因此需要在本机.NET代码中进行处理.其次,即使您可以将它们定义为extern,从属性内部执行不安全的非托管调用肯定会破坏属性使用的准则,因为更难以保证没有副作用.


Adr*_*scu 7

指南说,属性应该代表对象的状态,它不应该是昂贵的性能,并且除了计算/设置该状态之外它不应该具有副作用.我的猜测是GetType()不遵守这些规则,因此他们将其作为一种方法.

GetType()是一个稍微昂贵的操作.如果它是一个属性,它会鼓励使用像

DoStuff(obj.Type);
....
DoStuff(obj.Type);
Run Code Online (Sandbox Code Playgroud)

等等

代替

Type type = obj.GetType();
DoStuff(type);
....
DoStuff(type); 
Run Code Online (Sandbox Code Playgroud)

那不是那么理想.因此,他们提出了一种建议应该谨慎使用它的方法.

  • 我宁愿看到以前的代码.首先优化可读性.当你说它"略贵"时,我们真的说话有多贵?在我的NC10上网本上,对GetType()的1000万次调用大约需要200ms.这比仅仅同步然后返回私有变量的属性要快得多.(一个琐碎的财产仍然更快,诚然......)我不认为这是一个很好的理由使它成为一种方法. (6认同)
  • Jon Skeet,GetType执行所需的时间取决于您拥有的加载程序集数量.我正在尝试优化一些代码,在我的情况下,8个调用需要大约600毫秒,这是很多. (4认同)
  • mea culpa没有先测量.但我们需要记住,该方法是从1.0开始的,那些日子可能会更慢.只是我的2美分.无论如何 - 我刚被"骂":).这是一件好事 (2认同)