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

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

为什么我们不能单独使用本地人?

我在谈论这样的情况

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

我在考虑简单地使用

 public string MyProperty { get; set; } 

为什么冗余私有变量? 这两种策略有什么不同? 任何人都可以请注意这一点。

谢谢

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

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

为什么冗余私有变量? 这两种策略有什么不同? 任何人都可以请注意这一点。

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

数据validation

 // 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 chars = new List(); // Wraps up an underlying data store public string Value { get { return new String(chars.ToArray()); } set { chars = new List(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++; } } } 

你给出的第二个例子:

 public string MyProperty { get; set; } 

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

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

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

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

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

Mashesh,我们都必须从某个地方开始! 你用这个ex询问了私有变量vs属性:

 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 =“一个赋值字符串”;’。 这使您的意图更加清晰。 。 。

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

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

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

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

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

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

当有可能在类中内部通过属性本身或后备变量访问支持变量时,我发现尝试调试代码时会感到沮丧,并且没有任何东西告诉编码器正确的访问方式。

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

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

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