繁体   English   中英

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

[英]Why is Object.GetType() a method instead of a property?

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

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

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

[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType(); 

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

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

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

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

DoStuff(obj.Type);
....
DoStuff(obj.Type);

等等

代替

Type type = obj.GetType();
DoStuff(type);
....
DoStuff(type); 

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

据我所知,对于内部字段或值而言,通常认为这是很好的做法,这些字段或值很容易计算为使用属性公开,而其他值可能需要更多时间或其他资源来计算,使用方法公开。

只有微软可以回答这个问题,但我认为这是因为.NET Framework中的几个类使用额外的参数创建了自己的GetType()重载版本。 如果它是属性,则它们不能使用相同的名称(因为属性没有参数)。

只是我对这个问题的看法。

有点迟到的回复,但在试图找到相关的东西时遇到了问题。

GetType可能会抛出异常。 框架指南声明属性不应抛出异常。 这是它应该是一种方法而不是财产的另一个原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM