从设计角度来看,我想知道为什么.NET创建者选择System.Object.GetType()而不是System.Object.Type只读属性。
这只是一个(非常小的)设计缺陷还是有理由背后? 欢迎任何灯光。
答案 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可能会抛出异常。框架指南声明属性不应抛出异常。这是为什么它应该是一种方法而不是财产的另一个原因。