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

时间:2009-06-11 10:43:43

标签: c# .net clr

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

这只是一个(非常小的)设计缺陷还是有理由背后? 欢迎任何灯光。

5 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:7)

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

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

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

而不是

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

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

答案 2 :(得分:3)

据我了解,一般认为内部字段或值的良好做法是微不足道的,计算使用属性公开,以及可能需要更多时间或其他资源来计算的其他值使用方法。

答案 3 :(得分:3)

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

我对这个问题的看法。

答案 4 :(得分:2)

有点迟到的回复但在尝试找到相关内容时遇到了问题。

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