了解自动实现的属性

时间:2008-10-03 03:24:29

标签: c# .net-3.5 properties automatic-properties

我有使用自动实现的属性的简单类:

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

我显然在我的类中使用变量BarName,现在需要在设置属性值时添加逻辑(它必须全部为大写,如图)。这是否意味着我现在需要为BarName创建一个私有变量,例如_BarName,并将我班级中使用的当前BarName变量更改为_BarName?

Public Class foo
{
    public foo() {}  

    private string _BarName = "";
    public string BarName 
    { 
        get {return _BarName;}
        set {_BarName = Value.ToString().ToUpper();}
    }
}

我正在努力确保我理解使用自动实现的属性的含义,以及当我/如果我需要更改某些内容时它会带来什么。我假设重构,如上所示,不是breaking更改,因为该属性基本上保持不变;它只是在课堂上做了一些工作,以保持这种方式并添加所需的逻辑。

另一个可能更有意义的例子是我需要在使用setter或getter时调用某些方法;更多然后改变价值。

这似乎是设置属性的代码行和行的公平交易。

6 个答案:

答案 0 :(得分:7)

  

这是否意味着我现在需要   为BarName创建一个私有变量

  

并更改当前的BarName   我班上使用的变量

请勿更改类中的其余代码以使用您创建的新私有变量。 BarName 作为一个属性,旨在隐藏私有变量(以及其他内容),以避免您考虑对代码的其余部分进行全面更改。

  

我假设重构,如   如上所示,不是一个突破性的变化   因为财产基本上是   保持不变;它只花了一个   保持这种方式的小工作   添加所需的逻辑。

正确。

答案 1 :(得分:6)

您无需更改任何内容。自动实现的属性只是语法糖。编译器在后台为您生成私有变量和get / set逻辑。如果添加自己的getter / setter逻辑,编译器将使用您的代码而不是其自动生成的代码,但就该属性的 users 而言,没有任何改变;任何引用您的财产的代码都将继续有效。

答案 2 :(得分:5)

使用自动属性时,您无法直接访问基础“支持”变量,也无法访问在属性getter和setter中实现的实际逻辑。您只能访问该属性(因此在整个代码中使用BarName)。

如果您现在需要在setter中实现特定逻辑,则不能再使用自动属性,而是需要以“老式”方式实现该属性。在这种情况下,您需要实现自己的私有支持变量(首选方法,至少对我而言,是将私有支持变量命名为与属性相同的名称,但使用初始小写(在本例中为支持)变量将命名为barName)。然后,您将在getter / setter中实现适当的逻辑。

在您的示例中,您是正确的,它不是一个重大变化。这种类型的重构(从自动属性移动到“普通”属性不应该是一个重大变化,因为您不更改公共接口(公共属性的名称或可访问性)。

答案 3 :(得分:1)

如果您知道要验证该对象,请不要使用自动属性。这些对象可以是域对象等。如果你有一个Customer类,那么使用私有变量,因为你可能需要验证名称,birthdate等。但是如果你使用的是Rss类,那么只需使用自动属性就可以了。因为没有执行验证,并且该类仅用于保存一些数据。

答案 4 :(得分:0)

你对重构是正确的,它确实不应该破坏任何东西。

您是否确实需要通过类中的引用查看属性名称并更改它们以引用私有字段取决于内部代码是否需要访问数据的基础表示而不是如何访问被提交给全班的消费者。在大多数情况下,你可以独自留下足够的空间

在你的简单示例中,单独保留足够好并确保类内部的代码不会破坏在setter中执行的转换/格式化是明智的。

另一方面,如果getter正在做一些魔术,将字段的内部表示更改为消费者查看数据所需的方式,那么可能(在某些情况下)类中的内部代码需要访问该字段。

您需要查看类中每次出现对auto-property的访问,并决定是否应该触摸该字段或使用该属性。

答案 5 :(得分:0)

自动属性只是语法糖,编译器实际上为它创建了私有成员,但由于它是在编译时生成的,因此无法访问它。

稍后,如果你想为属性实现getter和setter,那么你只需为它创建一个显式私有成员并添加逻辑。