要使用只读属性还是方法?

Dav*_*New 68 .net c# methods properties class

我需要公开一个类实例的" is mapped? "状态.结果由基本检查确定.它不是简单地暴露字段的值.我不确定是否应该使用只读属性或方法.

只读属性:

public bool IsMapped
{
    get
    {
        return MappedField != null;
    }
}
Run Code Online (Sandbox Code Playgroud)

方法:

public bool IsMapped()
{
    return MappedField != null;
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了MSDN 在属性和方法之间选择,但我仍然不确定.

Car*_*ten 85

C#标准说

§8.7.4

属性是提供访问对象或类的特性的部件.属性的示例包括字符串的长度,字体的大小,窗口的标题,客户的名称等.属性是字段的自然扩展.两者都是具有关联类型的命名成员,访问字段和属性的语法是相同的.但是,与字段不同,属性不表示存储位置.相反,属性具有访问器,用于指定在读取或写入值时要执行的语句.

而方法定义为

§8.7.3

方法是实现可以由对象或类执行的计算或操作的部件.方法有一个(可能是空的)形式参数列表,一个返回值(除非方法的返回类型为void),并且是静态的或非静态的.

属性方法用于实现封装.属性封装数据,方法封装逻辑.这就是为什么如果要公开数据,你应该更喜欢只读属性.在您的情况下,没有逻辑可以修改对象的内部状态.您希望提供对对象特征的访问.

对象的实例是否是对象IsMapped的特征.它包含一个检查,但这就是您拥有访问它的属性的原因.可以使用逻辑定义属性,但它们不应公开逻辑.就像第一个引用中提到的例子一样:想象一下这个String.Length属性.根据实现,可能是此属性循环遍历字符串并对字符进行计数.它也执行一个操作,但"从外部"它只是给出了对象的内部状态/特征的声明.

  • "_你想提供对象特征的访问." - 这就是我所寻找的.这是适当的MSDN参考的最完整答案.谢谢. (4认同)
  • 虽然不是一个硬性规则,但是当返回属性的计算时间不重要时,我倾向于使用一种方法.属性应立即返回. (3认同)
  • +1用于明确关注语义,而不是正式标准 (3认同)

Mic*_*cha 21

我会使用该属性,因为没有真正的"做"(动作),没有副作用,它不是太复杂.


Har*_*san 11

我个人认为method应该做某事或做一些行动.你没有在里面IsMapped做任何事情所以它应该是一个property


ven*_*rik 7

我去找房产.主要是因为引用的MSDN文章的第一个句子:

通常,方法表示动作,属性表示数据.


nvo*_*igt 5

在这种情况下,我似乎很清楚它应该是一个属性。这是一个简单的检查,没有逻辑,没有副作用,没有性能影响。它没有比那个检查简单得多。

编辑:

请注意,如果出现任何上述的,你会把它变成一个方法,该方法应该包括一个强有力的动词,不是助动词像是或有。一种方法事情。只要它以动词开头,您就可以将其命名为VerifyMapping 或DeleteMappingExistance 或其他名称。

  • @MichaelKjörling 显然,他可以实现一个自定义运算符 != 来格式化他的硬盘,但是您可以通过多种方式破坏所有内容。只要未指定任何内容,我将假定我所看到的内容符合标准。 (4认同)

Jam*_*mes 5

我认为您链接中的这一行就是答案

方法代表动作,属性代表数据。

这里没有任何动作,只是一段数据。所以它是一个属性。

  • IEnumerable.Count() 是一个扩展方法,它基本上遍历集合并计数包含元素。另一方面, IList.Count 是一个属性,因为它不遍历列表 - 列表已经知道它的计数并简单地从属性返回它。 (9认同)
  • IEnumerable.Count() 不存在。Count() 是一种扩展方法,可在静态类 Enumerable 中找到,并且 1) 扩展属性不存在和 2) Count() 可能很耗时(尤其是在复杂的 LINQ 查询中)。 (5认同)
  • 它做一个计数......(一个动作) (3认同)
  • 但我也在做一个动作......一个`null`检查 (2认同)