属性与功能(特别是.NET)

时间:2009-10-16 19:46:55

标签: .net properties function

我已经阅读了关于这个主题的一些讨论,并且有一些我不明白的事情。

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

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

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

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

CNC中 我看到人们或多或少都认为属性是最好的选择。 我只是不明白为什么我发现了很多关于人们提倡反对财产的讨论。

6 个答案:

答案 0 :(得分:13)

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

例如

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

在这种情况下,是否将_birthday作为属性或字段公开肯定是有争议的。但对于像Age这样的其他计算值,将它们作为变量公开的唯一方法是将它们存储在对象中。在这种情况下,为Age提供额外的变量实质上是存储冗余信息。将其作为计算属性公开具有较小的开销并避免存储冗余数据

答案 1 :(得分:7)

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

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

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

此外,如果一个昂贵的财产受到意外的约束,它可能会带来严重的性能问题。 (属性可以“隐藏”数据绑定的属性,但只是使它们成为方法意味着您不必担心它。)

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

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

整数mCounter = 0;

我只是做

整数计数器= 0;。

如果我将来某个时候必须做“额外的东西”,我会创建具有相同名称的Property,并将变量重命名为mCounter。不可否认,这是我的懒惰,我并不真的推荐它。把它包装在一个房产里。)

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

属性比自动属性更多。如果你这样做:

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);
    }
}

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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