【问题标题】:Property vs Function (specifically .NET)属性与功能(特别是 .NET)
【发布时间】:2010-12-07 11:51:39
【问题描述】:

我已经阅读了一些关于这个主题的讨论,但有些东西我只是不明白。

最常见的答案似乎是这样的:使用 ReadOnly 属性返回缓存数据,使用函数返回非缓存数据。根本不要使用 WriteOnly 属性,因为“它没有意义”。

这没有性能原因。在 IL 中,MyProperty 以 get_MyPropertyset_MyProperty 方法存在。唯一的原因显然是应该假设上述答案。

好的,那为什么还要使用 ReadOnly 属性呢?为什么不直接将变量设为 Public 而不是 Private? 那为什么还要麻烦 Properties 呢?缓存数据 -> 公共变量,非缓存数据 -> 函数,写入数据 -> 子

让我们忘记以上所有,并使用属性作为一个方便的功能? 一个“项目”来获取和设置数据。使用常识了解 Get 是否不会返回缓存数据(可能导致延迟)。

-编辑- 我看到人们或多或少同意属性是最好的选择。 我只是不明白为什么我发现有这么多人们反对属性的讨论。

【问题讨论】:

  • 您的问题到底是什么?您的最后一段要么与您的问题相矛盾,要么提供您自己的答案。
  • 我的最后一段是提供我自己的意见。我正在寻找同意或不同意(提供原因)。

标签: .net properties function


【解决方案1】:

只读属性的一个很好的理由是计算的值。在这种情况下,没有要导出的变量。

例如

public class Person {
  private readonly DateTime _birthday;
  public int Age { get { return (DateTime.Now - _birthday).TotalYears; } }
  ...
}

在这种情况下,是否将 _birthday 公开为属性或字段当然值得商榷。但是对于像 Age 这样的其他计算值,将它们公开为变量的唯一方法是将它们存储在对象中。在这种情况下,为 Age 添加一个额外的变量本质上是存储冗余信息。将其公开为计算属性具有较小的开销并避免存储冗余数据

【讨论】:

    【解决方案2】:

    原因 #1 = 属性可用于数据绑定。方法不能。

    原因 #2 = 调试时监视窗口将自动公开属性/展开对象。以这种方式不会自动监视方法。

    我记得在某个地方读到 read 属性不应该改变对象状态。我认为这是一个很好的做法,特别是考虑到原因 #2。一旦你观察一个对象并在观察中展开它,对象的状态就会改变,从而使调试变得更加困难。

    此外,如果意外绑定昂贵的属性,它可能会带来严重的性能问题。 (属性可以从数据绑定中“隐藏”属性,但只是将它们设为方法意味着您不必担心它。)

    属性是窗口开发的便利。它们在设计师等中的“使用”方式不同。

    (我有时只是公开一些变量。但我将它们命名为属性。所以而不是

    整数 mCounter = 0;

    我只是这样做

    整数计数器 = 0;。

    如果将来我必须做“额外的事情”,我会创建具有相同名称的属性并将变量重命名为 mCounter。诚然,这是我的懒惰,我并不真正推荐它。只需将其包装在一个属性中即可。)

    【讨论】:

      【解决方案3】:

      属性是基于方法的操作的便捷替代品。 property-getter-setter 和执行相同操作的方法之间没有功能差异;事实上,如果您查看 IL,您会看到属性访问器被“get”和/或“set”方法所取代。

      使用属性而不是仅仅允许访问变量的最有力理由是封装。假设您正在编写一个库并公开了一个 IsBlue 变量。您分发图书馆,每个人都喜欢并使用它。现在,是版本 2 的时候了,当用户设置 IsBlue 时,你想做一些事情——也许执行检查,也许缓存一些东西。为此,您必须将变量转换为属性或方法,并在那里进行检查。现在,您已经破坏了所有客户端代码 - 他们访问的变量不再存在。如果您最初将其实现为属性,则可以只修改属性的代码,并保持二进制兼容性。

      【讨论】:

        【解决方案4】:

        属性不仅仅是自动属性。如果你这样做:

        public int MyProp { public get; public set; }
        

        那真的和

        public int MyProp;
        

        但前者最大的优势在于,你可以稍后将其更改为:

        public int MyProp {
            get {
                // Do some processing
                return someValue;
            }
        
            set {
                // Do some processing
                DoMyProcess(value);
            }
        }
        

        使用您的对象的其他代码无需重新编译即可工作。相反,如果您使用了公共字段,如果您想将其从字段更改为属性,则需要重新编译客户端代码。

        【讨论】:

        • @Dan:你说得对,对于我从事的 90% 的项目,这也没什么大不了的。像其他任何东西一样,属性是一种工具——如果它们对你有帮助就使用它们,如果它们没有帮助就忽略它们。然而,如此强调属性的原因与人们在 Java 中编写 getter 和 setter 的原因是一样的,甚至是人们编写 if(0 == foo) 而不是 if(foo == 0) 的原因——这是一种防御性编码机制,已成为一种习惯。许多人会争辩说这个习惯值得付出努力。同样,如果它对您有帮助,请使用它。
        【解决方案5】:

        “缓存数据 -> 公共变量” - 坏主意。这将允许另一个类修改缓存的数据。此外,为缓存计算数据可能会很昂贵:使用只读属性允许您推迟计算,直到访问该属性。

        【讨论】:

          【解决方案6】:

          在课堂上公开变量被认为是不好的做法。另外,如果您更改对象的结构但保持属性不变,则不会影响使用您的类的代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多