3

注意下面的代码是在一个类中的单个类

private string _fee;
private string _receipt;

public string Fee
{
    get { return _fee; }
    private set { _fee = value; }
}

public string Receipt
{
    get { return _receipt; }
    private set { _receipt = value;}
}

public MyValue(string fee, string receipt) : this()
{
    _fee = int.Parse(receipt).ToString();
    _receipt = receipt;
}

如您所见,我的财产没有任何作用,所以我应该使用

_fee = int.Parse(fee).ToString();
_receipt = receipt;

或者

Fee = int.Parse(fee).ToString();
Receipt = receipt;
4

4 回答 4

16

使用属性,如果你使用 C# 3,你应该使用自动实现的属性,如下所示:

public string Fee
{
    get; private set;
}

public string Receipt
{
    get; private set;
}

public MyValue(string fee, string receipt) : this()
{
    this.Fee = int.Parse(fee).ToString();
    this.Receipt = receipt;
}
于 2009-08-19T15:56:03.773 回答
10

我会一直使用属性——它给你更多的灵活性:

  • 如果需要,您可以稍后创建更精细的 getter 和 setter 方法
  • 您可以在 getter 和 setter 上指定不同的可见性
  • 如果需要,您可以定义虚拟属性并覆盖后代类中的那些
  • 您可以对属性使用数据绑定,但不能对字段使用数据绑定

此外,似乎 .NET 反射在属性和字段上的行为略有不同,因此,如果您混合使用属性和字段,则需要了解这些细微的差异 - 如果您只使用属性,那么您很高兴: -)

在类中,您可以使用后备存储字段或属性 - 如果您使用属性,将使用您的设置器可能具有的任何副作用(更新其他字段,记录您的调用等) - 如果您访问直接支持存储字段,您可以绕过这些。这可能是好事也可能是坏事 - 取决于您的情况。只要注意你在做什么!:-)

马克

于 2009-08-19T15:53:18.910 回答
4

在这种情况下,这并不重要,只要您在整个代码中保持一致即可。

但是,如果您的属性被标记为virtual,那么在构造函数中访问它们并不是一个好主意,最好直接使用这些字段。这是因为您的属性的行为可能会被覆盖,并且您的基类可能会调用破坏代码。


编辑:为了澄清,我只是指 OP 示例方法的差异。marc_s 给出了一些很好的观点,说明为什么属性在大多数情况下都是有利的。

于 2009-08-19T15:57:25.597 回答
0

我总是直接使用成员。

这是因为您可能在 setter 中实现无法从构造函数中正确运行的代码,因为其他一些字段未初始化。

如果属性是虚拟的,就像 womp 提到的那样,情况可能会变得更糟。

于 2009-08-19T16:37:40.290 回答