C# 什么时候对类定义使用方法比使用属性更好?

C# 什么时候对类定义使用方法比使用属性更好?,c#,properties,methods,class-design,C#,Properties,Methods,Class Design,我有一个系统,在这个系统中,我必须将复杂数据存储为字符串。我没有将这些字符串作为各种独立的对象进行解析,而是创建了一个包含所有这些对象的类,它有一些解析器逻辑,可以将所有属性编码为字符串,或者对字符串进行解码以获得这些对象。那很好。这个问题不是关于解析器本身,而是关于解析器的逻辑应该放在哪里。将其作为属性或方法是更好的选择吗 对于属性,例如publicstringdataasstring,get访问器将包含将所有数据编码为字符串的逻辑,而set访问器将解码输入值并设置类实例中的所有数据。它看起来

我有一个系统,在这个系统中,我必须将复杂数据存储为字符串。我没有将这些字符串作为各种独立的对象进行解析,而是创建了一个包含所有这些对象的类,它有一些解析器逻辑,可以将所有属性编码为字符串,或者对字符串进行解码以获得这些对象。那很好。这个问题不是关于解析器本身,而是关于解析器的逻辑应该放在哪里。将其作为属性或方法是更好的选择吗

对于属性,例如
publicstringdataasstring
get
访问器将包含将所有数据编码为字符串的逻辑,而
set
访问器将解码输入值并设置类实例中的所有数据。它看起来很方便,因为输入/输出实际上是一个字符串

对于方法,一个方法是
Encode()
,它返回编码字符串。然后,要么构造函数本身包含解码字符串的逻辑并需要字符串参数,要么我编写一个
Decode(string str)
方法,该方法单独调用。无论哪种情况,它都将使用方法而不是属性


那么,就代码的实际运行而言,这些路径之间有功能上的差异吗?或者它们基本上是等价的,然后归结为个人偏好的选择,或者哪一个看起来更好?在这种问题上。。。哪种看起来更干净?

没有功能上的区别;从行为的角度来看,属性只是一对
get
set
方法

但是,属性通常是轻量级的。如果属性的getter或setter正在执行大量计算,则通常鼓励将它们移动到方法


这方面有明显的例外(即ORM领域中的延迟加载,
get
可能触发数据库调用)。

就个人而言,我的属性非常愚蠢,只在极端情况下执行某些检查。i、 检查返回的参数是否为null,如果为null,则重新创建该参数或引发异常

让我们以Person类为例 在本例中,名称作为属性是有意义的。 Person.Speak()作为属性没有意义

这完全取决于它执行的功能。

“名词”:惯例是属性不执行实际的业务逻辑,也没有副作用,即更改对象状态(设置值除外)

动词:方法被期望起作用并且有副作用


例如“转换”、“解析”或“编码”“听起来像动词。我会使用方法。

如果您的类将在数据绑定情况下使用,那么您将需要属性。否则,请参考其他答案。

从技术上讲,他们也可以做同样的事情。通常,如果涉及复杂的处理,我会将其放在方法中,而不是属性中。这背后的主要原因(虽然我并不是说人们应该假设这一点)是,人们普遍认为属性应该允许快速访问数据,方法调用可能需要几个周期才能完成。人们应该这样假设吗?当然不会,但他们会


我喜欢用方法来提醒与我的代码交互的人,“嘿,这是一个方法,有一些处理正在进行,所以不要假设你会立即得到结果。”你也不能有异步属性访问。您可以启动一个方法,并在结果返回时收到通知。

另一点未提及,即如果写入对象上的一个或多个读写属性,然后在没有任何中间方法调用的情况下将所有属性读回,则读取的值应与写入的值匹配。如果编写属性Foo会导致读写属性栏的值发生变化,那么在我看来,这将是一个好迹象,表明其中一个应该是一对显式getter setter方法,而不是一个属性。net中有许多类违反了这一原则,但我认为这种行为是草率的。也许最严重的罪魁祸首是控制的有形财产。写入属性会更新状态无法读取的字段,而读取属性会返回某些计算的结果。更好的设计应该是具有读写隐藏属性和只读可见字段。顺便说一句,在一个稍微相似的注释上,我会将StringBuilder的“Length”属性设置为只读,但有方法截断或填充它;我唯一的读写属性是Value