C#中的属性是否应该执行大量工作?

时间:2010-05-06 22:26:57

标签: c# properties

当读取或分配属性时,人们不会期望它执行大量工作。当使用setSomeValue(...)getSomeValue(...)方法时,人们不应该对可能发生的重要事情感到惊讶。但是,现在C#给了世界 Properties ,使用getter和setter方法似乎很愚蠢。你对此有什么看法?我应该将此Q标记为社区维基吗?

感谢。

编辑:

在我的情况下,调用并不昂贵,但它触发在另一个类中设置相关属性,并可能将短消息写入日志文件(如果URL为空)。这对房产来说太过分了吗?有什么选择。

10 个答案:

答案 0 :(得分:18)

  

然而,现在C#给了全世界   属性,使用起来似乎很傻   取而代之的是getter和setter方法。

在考虑属性应该是多么昂贵之前,我建议你考虑一下你所建模的概念是否最好被表示为“某事物的属性”。属性存在于表达的语言中其他实体的归属 - 如果SomeValue在逻辑上不是它所属类型的属性,那么您应该考虑使用getter / setter方法。

  

C#中的属性是否应该执行很多   工作?

尽管如此,在可能的情况下,有助于使属性变得更便宜。大多数开发人员希望属性是围绕它们所属类型的某个内部状态的高效包装器。违反这种期望使开发人员更难编写使用该属性的性能良好的代码。例如,如果一个属性被用作for循环的条件,它将在每次迭代时进行评估 - 如果它很昂贵......那么这可能很糟糕。

通常也会在调试器中访问属性 - 您不希望属性执行昂贵的逻辑,因为这会阻止调试。执行具有副作用的操作的属性获取器(例如,查询数据库)通常也是一种不好的做法,因为在检查调试器中的应用程序行为时,它们可以引入heisenbugs

  

有什么选择。

您可能还想阅读this answer,它为房产设计提供了一些很好的一般指导原则。我还建议您阅读MSDN上的.NET设计指南中的Choosing Between Properties and Methods

有时创建一个只读(没有setter)的属性是有意义的,但是存在一个或多个单独的方法来设置与该属性相关的内部状态。是否使用此习惯用法取决于对象上的操作是否在语义上公开为“更改状态”“执行活动”。当它是后者时,我倾向于使用方法(而不是属性设置器)来表达这种行为。

答案 1 :(得分:4)

一般的经验法则是属性不应该是昂贵的。如果他们打电话很贵,那就把他们变成一个吸气剂。这并不总是遵循,你肯定需要使用判断。

答案 2 :(得分:3)

太多工作的确切数量值得商榷。最好的答案是,属性应该比更多的工作执行更少的工作:)

Get Properties 永远不应该做的一件事是改变对象的状态。

答案 3 :(得分:2)

  相反,使用

方法,人们不应该对引人注目的事情感到惊讶

由于属性只是一个语法糖而不是完全相同的Set ...和Get ...方法(由IL编译时由编译器生成) - 没有任何区别。如果你要在SetFoobar中实现一些逻辑 - 在Foobar中设置{set {...}}

答案 4 :(得分:2)

使用您创建的类的人不知道实现的内容。他可能反复使用User.ID而不知道每个都是数据库调用 你可以看到,99%的时候,属性只不过是带有额外代码行的变量,所以开发人员就这样对待它们。如果一个属性以任何方式都很昂贵,那么将一个属性重构为一个方法被认为是一种好习惯。你永远不知道一个方法隐藏了什么,(好)开发人员可以在调用方法时保留以前调用的结果。

答案 5 :(得分:1)

不,属性不应该做很多工作......

答案 6 :(得分:1)

“应该”他们?这是一个温文尔雅的问题。

他们当然可以,并且没有“很多”理由不这样做。堆栈溢出是避免在属性访问器中进行大量工作的一个很好的理由,但是如果你的代码是可读的并且你的意图很容易通信,那么没有硬性规则可以说是没有。

答案 7 :(得分:1)

属性真的只是syntactic sugar。作为一种最佳实践,我喜欢保持它们非常简单,而不是在其中放入大量代码。但是没有技术原因。最后,它们只是被执行的函数。使用它们时需要询问的是那些追随你的人最易于维护和直观的事情。

答案 8 :(得分:1)

我认为最好的规则是他们不应该抛出ecxeptions,也没有副作用。例如,如果您继续调用getter,并且没有其他更改,则返回的值不应更改。请注意,'DateTime.Now'不遵循此规则,但可能应该遵循此规则。

答案 9 :(得分:1)

作为一个类的用户,我希望属性不贵 - 因为顾名思义它们只是获取/设置一个对象的值。相反,当我在一个对象上调用一个方法时,我知道它会“做某事”并且可能很昂贵。

对于属性来说应该总是如此, property-getter应该没有副作用。例如。一个property-getter应该返回相同的值,即使我连续10次调用它。当您看到属性的这种用法时,这是最佳可见的:

int result = obj.SomeNumber + obj.SomeNumber;
// I expect SomeNumber to return the same value on both calls