2012-04-20 90 views
2

我应该使用哪种场景改变类的方法里面私有字段/属性:正确使用的字段被封装在属性的类内

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。

+3

只是一个方面的评论 - 这通常是一个坏主意,只有大写字母的名称和属性不同。常见的约定是命名字段_intVar和_stringVar,并且避免错误类型调用错误的可能性,或者更糟糕的是,如果你从'IntVar'中'返回IntVar',就会得到StackOverflowException。 – 2012-04-20 09:55:08

+0

+1感谢提示 – adams 2012-04-20 09:59:44

+0

但[根据微软](http://msdn.microsoft.com/en-us/library/ta31s3bc(v = vs.71).aspx),我们也不应该使用前缀字段名称。 – Botz3000 2012-04-20 10:03:55

回答

1

我会说使用属性通常更好。如果getter和setter很简单,无论如何它们可能会在运行时被抖动内联。正如你所说,也许会对财产代码进行其他更改。

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

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

0

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

+2

当你稍后向setter添加验证时,它会有所作为。 – 2012-04-20 09:55:06

1

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

在这种情况下,您将促进测试工作。变更实现者只需要检查公开名称而不是内部变量。

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被称为是更好地在这里使用的属性,因此该属性将处理验证,因为现场无法做到这一点。

+0

这是我在问题中提到的额外代码的示例。 – adams 2012-04-20 10:38:53