使用私人或使用财产? C#

时间:2009-08-19 15:51:38

标签: c# properties private

请注意,以下代码在类中是单个类

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:10)

我会一直使用属性 - 它为您提供了更大的灵活性:

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

此外,似乎.NET反射在属性与字段上的行为略有不同,因此如果您混合使用属性和字段,则需要了解这些细微差别 - 如果仅使用属性,则表示良好去: - )

在课堂内,您可以使用后备存储字段或属性 - 如果您使用该属性,将使用您的setter可能具有的任何副作用(更新其他字段,记录您的呼叫等) - 如果直接访问后备存储字段,则可以解决这些问题。这可能是好事还是坏事 - 取决于您的情况。只要知道你在做什么! : - )

马克

答案 2 :(得分:4)

在这种情况下,只要您在整个代码中保持一致就无所谓了。

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


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

答案 3 :(得分:0)

我总是直接使用这些成员。

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

如果属性是虚拟的,可能会变得更糟。