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。

4

4 回答 4

1

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

一个常见的更改是通过实现 INotifyPropertyChanged 添加更改通知。如果您直接设置字段,那么侦听器将不会收到通知。

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

于 2012-04-20T09:52:33.567 回答
1

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

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

于 2012-04-20T09:52:38.290 回答
1

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

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 时最好在此处使用该属性,因此该属性将处理验证,因为该字段无法执行此操作。

于 2012-04-20T09:54:16.563 回答
0

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

于 2012-04-20T09:51:50.657 回答