正确使用封装在类中的属性中的字段

时间:2012-04-20 09:48:36

标签: c# .net-2.0

我应该使用哪种方案来更改类方法/属性中的私有字段:

public class Example
{
 private int intVar = 0;
 private string stringVar = string.Empty;

 public int IntVar
 {
  get { return this.intvar; }
  set { this.intvar = value; }
 }

 public string StringVar 
 {
  get { return this.stringVar ; }
  set { this.stringVar = value; }
 }

 private void SomeMethod()
 {
  //change fields in this way:
  this.intVar = 50;
  this.stringVar = "changed";
  //or that way(through properties):
  this.IntVar = 50;
  this.StringVar = "changed";
 }
}

也许在这个例子中它没有任何区别,但如果有人向属性添加额外的代码,并通过属性更改字段会改变其他一些事情呢?

你能说哪种方式更好,或者它真的没什么区别?

我知道自C#3.0以来我可以编写自动实现的属性,但这是C#2.0。

4 个答案:

答案 0 :(得分:1)

我说使用房产通常会更好。如果getter和setter很简单,那么它们可能会在运行时通过抖动进行内联。正如您所说,可能会对属性代码进行其他更改。

一个常见的变化是通过实施INotifyPropertyChanged添加更改通知。如果直接设置字段,则不会通知监听器。

我更喜欢我的类使用他们自己的公共接口而不是内部。对我来说例外是我明确不想要任何副作用。但情况很少见。

答案 1 :(得分:1)

根据我的经验,始终使用属性,不要尝试直接访问var。 如果将来有人向属性访问器添加代码,那么它是否有责任检查其更改的副作用。

在这种情况下,您将为测试工作提供便利。变更实施者只需要检查公共名称而不是内部变量。

答案 2 :(得分:1)

如果你进行某种验证,例如当intVar超过100时将一个Example对象标记为无效,那么你应该使用属性。

public int IntVar
 {
  get { return this.intvar; }
  set 
      { 
         if ( value > 100)
            // handle this corner case
         else      
           this.intvar = value; 
      }
 }

假设您的私有方法进行了一些计算

private void SomeMethod()
 {
   int result = ...;
   IntVar = result;
 }

调用SomeMethod时最好在这里使用属性,因此该属性将处理验证,因为该字段无法执行此操作。

答案 3 :(得分:0)

它没有任何区别,是个人偏好 我更喜欢使用这些属性。