使用只读属性或方法

本文关键字:方法 只读属性 | 更新日期: 2023-09-27 18:15:56

我需要公开是否映射?"类实例的状态。结果由基本检查决定。它是而不是,只是暴露字段的值。我不确定我应该使用只读属性还是方法。

只读属性:

public bool IsMapped
{
    get
    {
        return MappedField != null;
    }
}

方法:

public bool IsMapped()
{
    return MappedField != null;
}

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

使用只读属性或方法

C #标准说

§8.7.4

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

而as方法定义为

§8.7.3

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

属性方法实现封装。属性封装数据,方法封装逻辑。这就是为什么在公开数据时应该选择只读属性的原因。在这种情况下,没有修改对象内部状态的逻辑。您希望提供对对象特性的访问。

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

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

我个人认为method应该做些什么或执行一些行动。你没有在IsMapped内执行任何东西,所以它应该是一个property

我去一个属性。主要是因为引用的msdn文章的第一句话:

一般来说,方法表示动作,属性表示数据。

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

编辑:

请注意,如果有上面提到的任何一个,你要把它放在一个方法中,这个方法应该包括一个强动词,而不是像is或has这样的助动词。方法做一些的事情。你可以将它命名为VerifyMapping或determinemappingexist或其他东西只要它以动词开头。

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

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

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

在您可以访问这两种结构的情况/语言中,一般划分如下:

  • 如果请求对象具有,则使用属性(或字段)。
  • 如果请求是对象所做的事情的结果,则使用方法。
更具体地说,属性用于以读和/或写的方式访问(出于消费目的)由公开该属性的对象拥有的数据成员。属性比字段更好,因为数据不必一直以持久形式存在(它们允许您"偷懒"计算或检索此数据值),并且在此目的上它们比方法更好,因为您仍然可以在代码中使用它们,就好像它们是公共字段一样。 然而,

属性不应该导致副作用(除了可能的、可以理解的例外,即设置一个变量意味着持久化要返回的值,避免多次重新计算一个值,代价高昂);在其他条件相同的情况下,它们应该返回一个确定性的结果(所以NextRandomNumber对于属性来说是一个糟糕的概念选择),并且计算不应该导致任何可能影响其他计算的状态数据的改变(例如,按该顺序获得PropertyA和PropertyB不应该返回与获得PropertyB和PropertyA不同的结果)。

方法OTOH在概念上被理解为执行某种操作并返回结果;简而言之,它所做的事情可能超出了计算返回值的范围。因此,当返回值的操作具有额外的副作用时,应使用方法。返回值可能仍然是某些计算的结果,但计算方法可能non-deterministically (GetNextRandomNumber()),或者返回的数据的形式是独一无二的一个对象的实例,并再次调用的方法产生不同的实例,即使它可能有相同的数据(GetCurrentStatus()),或者方法可能改变状态数据,这样连续两次做同样的事情会产生不同的结果(EncryptDataBlock ();许多加密密码都是这样设计的,以确保对同一数据进行连续两次加密会产生不同的密文)。

如果在任何时候您需要添加参数来获取值,那么您需要一个方法。否则,您需要属性

IMHO,第一个只读属性是正确的,因为IsMapped作为对象的属性,并且您不执行操作(仅执行计算),但在一天结束时,与现有代码库的一致性可能比语义....更重要除非这是一个单一的赋值

我同意这里的人的说法,因为它正在获取数据,并且没有副作用,它应该是一个属性。

进一步说,我也接受setter(而不是getter)的一些副作用,如果这些副作用对于"从外部看"的人来说是有意义的。

方法是动词,属性是形容词(同时,对象本身是名词,静态对象是抽象名词)。

动词/形容词原则的唯一例外是,当获取(或设置)相关信息可能非常昂贵时,使用方法而不是属性是有意义的:从逻辑上讲,这样的特性可能仍然应该是一个属性,但是人们习惯于认为属性对性能的影响很小,虽然没有真正的理由为什么总是这样,但强调GetIsMapped()相对较重的性能可能是有用的,如果它实际上是。

在运行代码的层面上,调用属性和调用等价的get或set方法之间绝对没有区别;这一切都是为了让使用它编写代码的人的生活更轻松。

我希望属性,因为它只返回字段的详细信息。另一方面,我希望

MappedFields[] mf;
public bool IsMapped()
{
     mf.All(x => x != null);
}

你应该使用这个属性,因为c#有这个属性