【问题标题】:Use private or use properties? C#使用私有还是使用属性? C#
【发布时间】:2010-11-21 00:23:28
【问题描述】:

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

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;

【问题讨论】:

  • 哦,这是我在 ReSharper 中使用的第一个脚本。我就是喜欢它!

标签: c# properties private


【解决方案1】:

使用属性,如果您使用的是 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;
}

【讨论】:

    【解决方案2】:

    我总是使用属性——它给你更多的灵活性:

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

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

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

    马克

    【讨论】:

    • +1,但我会在您的第一点和反射 cmets 中添加“不破坏二进制兼容性”。否则你仍然可以重构一个私有字段。
    • 我开始怀疑 c# 编译器是否应该允许公共字段。似乎没有理由使用它们。
    【解决方案3】:

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

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


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

    【讨论】:

      【解决方案4】:

      我总是直接使用成员。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 2011-03-19
        相关资源
        最近更新 更多