为什么我应该在属性访问器中使用私有变量?

时间:2009-12-25 17:20:03

标签: c# asp.net variables properties private

对不起如果我是菜鸟,我有这个疑问,为什么我们使用私有变量并使用属性设置它们?

为什么我们不能单独使用专业人士?

我在谈论像这样的情况

private string _testVariable;

public string MyProperty
{
    get { return _testVariable;}
    set {_testVariable = value;}
}

我在考虑使用

public string MyProperty { get; set; } 

为什么冗余私有变量?这两种策略有什么不同?任何人都可以对此有所了解。

由于

9 个答案:

答案 0 :(得分:30)

您的示例在语义上是相同的。简洁的属性声明语法(只有{ get; set; })是C#3.0中提供的快捷方式。编译器实际上创建了一个私有后备变量和一个简单的getter和setter,如第一个例子所示。

如果你正在做的只是创建一个getter和setter(并且在发生任何事情时都没有实际发生),那么简洁的语法是一个不错的选择。如果在设置值时必须执行任何其他操作(例如重绘控件),则需要完整语法。

答案 1 :(得分:13)

  

为什么冗余私有变量?是   这两种策略有何不同?能够   请有人点亮   此

如果你所做的只是读/写变量,那么没有。否则,您需要私有变量的原因有两个:

数据验证

// Data validation
public class IntWrapper
{
    private int _value;
    public int Value
    {
        get { return _value; }
        set
        {
            if (value < 0) { throw new Exception("Value must be >= 0"); }
            _value = value;
        }
    }
}

Getter / setter包装基础数据存储

public class StringBuffer
{
    List<char> chars = new List<char>();

    // Wraps up an underlying data store
    public string Value
    {
        get { return new String(chars.ToArray()); }
        set { chars = new List<char>(value.ToCharArray()); }
    }

    public void Write(string s) { Write(chars.Count, s); }

    public void Write(int index, string s)
    {
        if (index > chars.Count) { throw new Exception("Out of Range"); }
        foreach(char c in s)
        {
            if (index < chars.Count) { chars[index] = c; }
            else { chars.Add(c); }
            index++;
        }
    }
}

答案 2 :(得分:2)

您给出的第二个例子:

public string MyProperty { get; set; }

仅适用于.Net框架的更高版本(我相信v3.0)

第一个示例允许您在return和赋值语句上设置断点,导致调试器在分配/读取属性时中断。

答案 3 :(得分:2)

第一个代码剪辑会让您修改一些私有类状态。在属性中包装私有状态很好,因为它隐藏了实现。稍后您可以更改实现,属性(外部接口)可能保持不变。

例如,假设您不是在setter中设置单个字符串,而是在某种私有存储中设置字符串。您将其写入文件,或将其写入共享内存。或者,您可能只计算字符串的哈希值,并且根本不存储它,就像您可能使用密码一样。

第二个代码片段中的自动属性根本与私有变量无关。自动属性设计(如第一个剪辑中使用的显式属性设计)允许将来进行修改。例如,作为修改的一部分,您可以从自动属性转换为显式实现的属性。

答案 4 :(得分:2)

Mashesh,    我们都必须从某个地方开始!你用这个ex:

询问了私有变量与属性的关系
private string _testVariable;

public string MyProperty
{
    get { return _testVariable;}
    set {_testVariable = value;}
}

-or-

public string MyProperty { get; set; }

你有没有考虑过:

public string MyProperty { get; private set; }

您可以将范围应用于属性getter / setter。 。 。 。酷的东西。哦耶 。 。 。当在定义类中使用这种类型的属性时(比如在构造函数中),在它前面加上'this'。 - 所以赋值看起来像'this.MyProperty =“一个赋值字符串”;'。这使您的意图更多更清晰。 。

答案 5 :(得分:0)

属性基本上是字段的包装器。这个包装器可以使用来自外部世界的变量。在C#3.0中,您可以简单地声明类似public string MyProperty { get; set; }的属性。编译器会自动声明一个私有变量,并为此获取set方法。如果您需要在声明属性的类中执行任何计算,那么您应该使用私有字段。

答案 6 :(得分:0)

有时您不知道何时第一次编写代码,是否可能在以后添加一些需要使用私有变量的代码。当然,如果需要,您可以稍后添加。我只是自动创建私有变量,假设它将在以后使用。

这可能更适用于大型企业应用程序或快速发展的应用程序(敏捷),在初始编码期间可能无法了解完整实施。

答案 7 :(得分:0)

我讨厌在不需要时支持变量,这会导致必要的复杂性。

显然,如果你需要在getter或setter中做一些特殊的事情,那么应该使用完整的语义形式,而不是糖。

此外,我喜欢使用属性作为调试属性设置或使用方法的方法有时由于反射而不是那么明显,这也是我喜欢使用它们的一个原因。

我发现,当有可能在类中由内部属性或后备变量访问后备变量时,尝试调试代码是令人沮丧的,并且没有任何内容告诉编码器正确的访问方式。

您可以在内部访问支持变量以及属性,这是正确的方法吗?这不明显......

答案 8 :(得分:-1)

这与C#langugage无关,但更多的是应用程序。

使用属性的一个原因是它在许多框架中被视为“特殊”。 例如,Silverlight和WPF将绑定到属性而不绑定到字段