25

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

为什么我们不能单独使用properites?

我说的是这样的情况

private string _testVariable;

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

我正在考虑简单地使用

public string MyProperty { get; set; } 

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

谢谢

4

9 回答 9

31

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

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

于 2009-12-25T17:27:00.180 回答
16

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

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

数据验证

// 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++;
        }
    }
}
于 2009-12-25T18:14:31.933 回答
2

您给出的第二个示例:

public string MyProperty { get; set; }

仅在 .Net 框架的更高版本中可用(我相信 v3.0 及更高版本)

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

于 2009-12-25T17:25:24.830 回答
2

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

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

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

于 2009-12-25T17:25:48.980 回答
2

马什什,我们都必须从某个地方开始!您通过以下方式询问了私有变量与属性:

private string _testVariable;

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

-or-

public string MyProperty { get; set; }

您是否考虑过:

public string MyProperty { get; private set; }

您可以将范围应用于属性 getters/setters 。. . . 酷的东西。哦耶 。. . 在定义类中(如在构造函数中)使用这种类型的属性时,在它前面加上一个“this”。- 所以分配看起来像'this.MyProperty = "An Assigned String";'。这让你的意图更加清晰。. .

于 2010-01-01T03:46:52.007 回答
0

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

于 2009-12-25T17:28:21.860 回答
0

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

这可能与大型企业应用程序或快速发展的应用程序(敏捷)更相关,在这些应用程序中,在初始编码期间可能不知道完整的实现。

于 2009-12-25T17:33:55.673 回答
0

我讨厌不需要的支持变量,这会导致更多的复杂性而不是必要的。

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

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

当支持变量可能通过它自身的属性或支持变量在类内部访问并且没有告诉编码器正确的访问方式时,我发现尝试调试代码令人沮丧。

您可以在内部访问支持变量以及属性,那么哪种方法是正确的?不是很明显...

于 2013-07-09T13:31:13.197 回答
-1

这与 C# 语言无关,而与应用程序有关。

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

于 2010-01-01T04:04:03.407 回答