4

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

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

我试图确保我了解使用自动实现的属性的含义,以及当/如果我需要更改某些内容时它将带来什么。我假设重构(如上所示)不是重大更改,因为属性基本保持不变;只需要在类中做一些工作就可以保持这种状态并添加所需的逻辑。

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

这似乎是对设置属性的代码行和代码行的公平权衡。

4

6 回答 6

7

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

是的

并更改整个班级使用的当前 BarName 变量

不要更改类中的其余代码以使用您创建的新私有变量。BarName作为一个属性,旨在隐藏私有变量(除其他外),以​​避免您考虑对其余代码进行彻底更改。

我假设重构(如上所示)不是重大更改,因为属性基本保持不变;只需要做一些工作就可以保持这种状态并添加所需的逻辑。

正确的。

于 2008-10-03T03:41:23.180 回答
6

你不需要改变任何东西。自动实现的属性只是语法糖。编译器在幕后为您生成私有变量和获取/设置逻辑。如果您添加自己的 getter/setter 逻辑,编译器将使用您的代码而不是其自动生成的代码,但就该属性的用户而言,没有任何改变;任何引用您的财产的代码都将继续有效。

于 2008-10-03T03:27:46.757 回答
5

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

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

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

于 2008-10-03T03:33:03.340 回答
1

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

于 2008-10-03T04:42:08.730 回答
0

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

您是否真的需要通过类中对属性名称的引用并将其更改为引用私有字段将取决于内部代码是否需要访问数据的底层表示,而不是如何呈现给类的消费者。在大多数情况下,您可以独自离开。

在您的简单示例中,明智的做法是保持足够好,并确保类内部的任何代码都不会破坏 setter 中正在执行的转换/格式化。

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

您需要查看对类中自动属性的每次访问,并决定它是应该触摸该字段还是使用该属性。

于 2008-10-03T03:32:38.740 回答
0

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

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

于 2008-10-03T03:34:55.583 回答