【问题标题】:Reason behind the get prefix in c#c#中get前缀背后的原因
【发布时间】:2018-10-25 08:18:43
【问题描述】:

考虑到在 c# 中我们对带有 getter 和 setter 的属性有特定的语法,为什么有些属性是通过方法(通常以“Get”为前缀)而不是 getter 来访问的?

例如为什么会这样:

var properties = object
    .GetType()
    .GetProperties();

而不是使用像这样的getter:

var properties = object
    .Type
    .Properties

【问题讨论】:

  • 我想这源于一个历史概念,即方法应该引用动词。我尽量避免这种情况,并使用属性而不是方法。
  • 没看到那个错字,谢谢@xanatos
  • 您示例中的后者实际上是property 而不是method。由于 MS 指南“重”执行应该在方法而不是属性中执行 - 这可能是他们选择方法而不是道具的原因
  • 您可以为GetType 创建重载方法。使用propertiesauto-implemented properties 是不行的。
  • @Halex 任何不只是在内存中查找值的东西。接受的答案也很好地解释了它。 Mirosofts 设计指南书中提到了这一点。

标签: .net reflection syntax properties getter


【解决方案1】:

Design Guidelines for Developing Class Libraries 有话要说:

如果成员表示该类型的逻辑属性,请考虑使用属性。

GetType() 定义在所有类型的基本类型 object 上。您不希望 每个 类型始终具有 Type 属性。

如果属性的值存储在进程内存中并且该属性仅提供对该值的访问,请使用属性而不是方法。

据我所知,需要进行一些翻译才能将 CLR 的内部元数据转换为 PropertyInfo 对象。

【讨论】:

  • 是的。如果我的属性不仅仅是简单的查找,我认为它们是虚假广告。
  • @codecaster 我认为第一个准则(“考虑使用属性...”)将支持更多 Type 属性而不是 GetType 方法。文中给出的示例(关于 ListViewBorderStyle,在 WPF 中的一个属性),可以通过查看 Control 类(这是所有 WPF 控件的基类,如 Object 是所有 .NET 对象的基类)具有大量由Control 的所有子类共享的属性。除非您想创建逻辑属性与元属性(Type 是对象的元属性)
【解决方案2】:

GetProperties() 的答案很简单:它为每次调用从MSDN 返回一个新的属性数组(内部属性数组的过滤(仅公开)副本):

在以下情况下,请使用方法而不是属性。

该操作返回内部状态的副本(这不包括堆栈上返回的值类型对象的副本)。

操作返回一个数组。

对于GetType()我不知道。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2018-06-07
    • 1970-01-01
    • 2011-01-31
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-10-09
    相关资源
    最近更新 更多