我需要暴露类实例的"is mapped?"状态。结果通过基本检查确定,这不仅仅是暴露字段的值。我不确定是否应该使用只读属性还是方法。
只读属性:
public bool IsMapped
{
get
{
return MappedField != null;
}
}
方法:
public bool IsMapped()
{
return MappedField != null;
}
我已经阅读了MSDN的选择属性和方法之间,但我仍然不确定。
C#标准规定:
§ 8.7.4
属性是提供对象或类的特征访问的成员,例如字符串的长度、字体的大小、窗口的标题、客户的名称等。属性是字段的自然扩展,两者都是带有关联类型的命名成员,并且访问字段和属性的语法相同。但是,与字段不同,属性不表示存储位置。相反,属性具有访问器,指定读取或写入其值时要执行的语句。
而方法的定义如下:
§ 8.7.3
方法是实现可以由对象或类执行的计算或操作的成员。方法具有(可能为空的)形式参数列表、返回值(除非方法的返回类型为void),并且可以是静态或非静态的。
属性和方法用于实现封装。属性封装数据,方法封装逻辑。这就是为什么如果你正在公开数据,应该首选只读属性。在你的情况下,没有逻辑修改对象的内部状态。你想要提供对对象特征的访问。
你的对象实例是否映射是你对象的一个特征。它包含一个检查,但这就是你使用属性访问它的原因。属性可以使用逻辑定义,但不应公开逻辑。就像在第一段引文中提到的例子:想象一下String.Length
属性。根据实现方式,它可能需要遍历字符串并计算字符数。它执行了一个操作,但“从外部”看,它只是表达了对象内部状态/特征的陈述。
我会使用这个属性,因为它没有真正的“执行”(动作),没有副作用,并且不太复杂。
我个人认为一个方法
应该执行某些操作或者行为。由于你在IsMapped
中没有执行任何操作,所以它应该是一个属性
我会选择属性。主要是因为在MSDN文章中引用的第一句话:
通常,方法代表操作,属性代表数据。
MappedField
是简单、快速且没有副作用的。但我们并不知道这是真实情况。 - user这里没有动作,只有一段数据。因此它是一个属性。方法代表动作,属性代表数据。
null
检查。 - Dave New如果在任何时候你需要添加参数才能获取值,那么你需要一个方法。否则你需要一个属性。
我认为第一个只读属性是正确的,因为IsMapped作为对象的一个属性,你并没有执行动作(只是评估),但在一天结束时,与现有代码库的一致性可能比语义更重要....除非这是一个大学作业
GetIsMapped()
确实很耗费资源,突出显示它的相对性能较差可能会有用。
MappedField
意味着什么?它是一个简单的变量读取,还是一个可能昂贵的操作或具有副作用(例如延迟加载)的操作? - user