代码之家  ›  专栏  ›  技术社区  ›  Serge Wautier

为什么object.gettype()是方法而不是属性?

  •  12
  • Serge Wautier  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 15 年前
        1
  •  17
  •   Martin Harris    15 年前

    如果查看Reflector中的getType()声明,您会发现:

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

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

    这导致了两个原因,即不将getType方法实现为属性。首先,不能像使用方法那样定义属性extern,因此需要在本机.NET代码中处理它。其次,即使可以将它们定义为外部的,从属性内部执行不安全的、非托管的调用也肯定会违反属性使用准则,因为很难保证没有副作用。

        2
  •  7
  •   Adrian Zanescu    15 年前

    指导方针说,属性应该表示对象的状态,它不应该是昂贵的性能方面的,并且除了计算/设置该状态之外,它不应该有副作用。我猜getType()不遵守这些规则,所以它们将其作为一个方法。

    getType()是一个稍微昂贵的操作。如果它是一种财产,它会鼓励像

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

    等。

    而不是

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

    这并不是最理想的。因此,他们提出了一种方法,建议应该谨慎地调用它。

        3
  •  3
  •   Joel in Gö    15 年前

    据我所知,对于使用属性计算要公开的内部字段或值,以及使用方法公开可能需要更多时间或其他资源计算的其他值,通常认为这是一种良好的实践。

        4
  •  3
  •   Philippe Leybaert    15 年前

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

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

        5
  •  2
  •   Mikko Rantanen    15 年前

    回答得有点晚,但在试图找到相关的问题时突然陷入了困境。

    getType可以引发异常。框架准则声明属性不应抛出异常。这也是为什么它应该是方法而不是属性的另一个原因。