使用只读属性或方法?
我需要暴露一个类的实例的“ 被映射? ”状态。 结果由一个基本的检查决定。 这不是简单地暴露一个领域的价值。 我不确定应该使用只读属性还是方法。
只读属性:
public bool IsMapped { get { return MappedField != null; } }
方法:
public bool IsMapped() { return MappedField != null; }
我已阅读MSDN的属性和方法之间的select,但我仍然不确定。
C#标准说
§8.7.4
属性是提供对象或类的特征的成员。 属性的例子包括string的长度,字体的大小,窗口的标题,客户的名字等等。 属性是领域的自然延伸。 两者都是具有关联types的成员,并且访问字段和属性的语法是相同的。 但是,与字段不同,属性不表示存储位置。 相反,属性具有访问器,用于指定在读取或写入值时要执行的语句。
而方法被定义为
§8.7.3
方法是实现可以由对象或类执行的计算或操作的成员。 方法有一个(可能是空的)forms参数列表,一个返回值(除非方法的返回types是void),并且是静态的或者非静态的。
使用属性和方法来实现封装 。 属性封装了数据,方法封装了逻辑。 这就是为什么如果你正在暴露数据,你应该更喜欢一个只读属性。 在你的情况下,没有任何逻辑修改你的对象的内部状态。 您想要提供对某个对象特性的访问权限 。
你的对象的一个实例是否被IsMapped
是你的对象的一个特征。 它包含一个支票,但这就是为什么你有属性来访问它。 属性可以用逻辑来定义,但不应该公开逻辑。 就像第一个引用中提到的例子:想象一下String.Length
属性。 根据实现的不同,可能是该属性在string中循环并对字符进行计数。 它也会执行一个操作,但是“从外部”只是对对象的内部状态/特性给出一个声明。
我会用财产,因为没有真正的“做”(行动),没有副作用,也不是太复杂。
我个人认为,一种method
应该做一些事情或者采取一些行动。 您在IsMapped
内部没有执行任何IsMapped
所以它应该是一个property
我会去一个财产。 主要是因为引用的MSDN文章中的第一个句子:
通常,方法表示动作和属性表示数据。
在这种情况下,我觉得这应该是一个财产。 这是一个简单的检查,没有逻辑,没有副作用,没有性能影响。 这并不比检查简单得多。
编辑:
请注意,如果有上面提到的任何一个,你会把它放到一个方法,该方法应该包括一个强大的动词,而不是像是或已经有一个助动词。 一个方法做一些事情。 您可以将其命名为VerifyMapping或DetermineMappingExistance或其他名称,只要它以动词开头即可。
我认为这条线在你的链接是答案
方法表示动作和属性表示数据。
这里没有任何行动,只是一个数据。 所以这是一个财产。
如果在任何时候您需要添加参数才能获得该值,那么您需要一个方法。 否则,你需要一个财产
恕我直言,第一个只读的属性是正确的,因为IsMapped作为你的对象的属性,而你没有执行一个动作(只有一个评估),但在一天结束时,与现有的代码库的一致性可能超过语义….除非这是一个单一的任务
我同意这里的人说,因为它是获取数据,没有副作用,所以应该是一个财产。
为了扩大这个范围,如果副作用对于“从外面看”的人来说是有意义的,那么我也会接受一个带有一个setter(但不是一个getter)的副作用。
其中一种方法是动词,属性是形容词(同时,对象本身是名词,静态对象是抽象名词)。
动词/形容词指南的唯一例外是,在获取(或设置)所涉及的信息时,使用方法而不是属性可能是非常昂贵的:从逻辑上讲,这样的特征可能仍然是属性,但是人们习惯于将属性视为低影响的性能方式,虽然没有真正的原因为什么总是这样,但是突出显示如果实际上是GetIsMapped()
的性能相对较高。
在运行代码的层面上,调用一个属性和调用等价方法来获取或设置是完全没有区别的。 这一切都是为了让使用它的人编写代码更容易。
在你可以访问这两种结构的情况/语言中,一般的划分如下:
- 如果请求是针对对象所具有的 ,请使用属性(或字段)。
- 如果请求是针对对象所做的事情的结果,请使用方法。
更具体地说,一个属性将被用来以读取和/或写入的方式访问由暴露该属性的对象拥有的(用于消费目的的)数据成员。 属性比字段更好,因为数据不必始终以永久forms存在(它们允许你对这个数据值的计算或检索“懒惰”),而且它们比这个目的的方法更好,因为您仍然可以在代码中使用它们,就好像它们是公共字段一样。
然而,属性不应该导致副作用(设置一个可能的,可理解的例外是设置一个variables来保持返回的值,避免昂贵的重新计算多次所需的值); 他们应该在所有其他条件相同的情况下返回一个确定性的结果(所以NextRandomNumber对于一个属性来说是一个糟糕的概念select),并且计算不应该导致任何会影响其他计算的状态数据的改变(例如获取PropertyA和PropertyB的顺序不应该返回任何不同的结果比得到PropertyB,然后PropertyA)。
OTOH方法在概念上被理解为执行一些操作并返回结果; 总之,它做了一些事情,这可能超出计算回报价值的范围。 因此,当返回值的操作具有附加的副作用时,将使用方法。 返回值可能仍然是某些计算的结果,但是该方法可能已经非确定性地计算(GetNextRandomNumber()),或者返回的数据是对象的唯一实例的forms,并再次调用该方法一个不同的实例,即使它可能有相同的数据(GetCurrentStatus()),或者该方法可能会改变状态数据,使得连续两次执行完全相同的事情会产生不同的结果(EncryptDataBlock();许多encryption密码以这种方式工作devise,以确保连续两次encryption相同的数据产生不同的密文)。
我期待财产,因为它只是返回一个字段的细节。 另一方面,我期望
MappedFields[] mf; public bool IsMapped() { mf.All(x => x != null); }
你应该使用该属性,因为c#有这个原因的属性
- 如何防止“aspxerrorpath”作为查询string传递给ASP.NET自定义错误页面
- CryptographicException在试图导出X509私钥的RSAParameters时“密钥无法在指定状态下使用”
- Automapper:使用Entity Framework 4 Proxy Pocos在inheritance上映射问题,在集合上映射抽象基类
- 在.NET Web应用程序中获取当前目录
- 无法添加对dll的引用
- 无法使用GetManifestResourceStream()加载清单资源
- ServiceStack.Net Redis:存储相关对象与相关对象ID
- 如何在winforms中设置input密码的文本框?
- 我可以在Visual Studio 2008中开发.NET Framework 4吗?