您应该使用属性来初始化构造函数中的字段吗?

时间:2013-03-14 17:10:48

标签: c# properties encapsulation

非常简单的问题,我应该使用我的属性初始化构造函数中的字段还是直接引用它们?

示例:

public class Foo()
{
   private string example;

   public String Example
   {
      get/set etc..
   }

   public Foo(string exampleIn)
   {
      Example = exampleIn;
   }
}

或者更好的做法是:

public class Foo()
{
   private string example;

   public String Example
   {
      get/set etc..
   }

   public Foo(string exampleIn)
   {
      example = exampleIn;
   }
}

无论哪种方式,我都认为不会违反封装,所以我想知道是否有一种首选的方式?

3 个答案:

答案 0 :(得分:2)

这里确实没有正确或错误的答案(因此我很想投票结束)。但是,我倾向于同意Jacob。我更喜欢属性getter和setter路由,特别是现在我们有自动属性。请记住,如果因任何原因影响您的决定,您可以对getter和setter进行不同的访问修改。我的意思是,如果你打算在构造函数中使用该属性,那么尝试保持一致,并且只在类中的其他地方使用它。这可能意味着您不希望将setter暴露给外部。

public class Foo()
{
   private string example;

   public String Example
   {
     get { return example; }
     private set { example = value; }
   }

   public Foo(string exampleIn)
   {
      Example = exampleIn;
   }
}

答案 1 :(得分:0)

在自动属性(在C#3.0中引入)之前,我认为你的第二个例子更“合适”。现在有了自动属性,我认为这是最好的:

public class Foo()
{
   private string example;

   public String Example
   {
      { get; set; }
   }

   public Foo(string exampleIn)
   {
      Example = exampleIn;
   }
}

答案 2 :(得分:0)

这取决于是否将在Setter内进一步处理数据值。如果价值需要处理,那么最好使用@Jacob所说的内容,但如果价值不会被进一步处理(在大多数情况下就是这种情况),最好使用私有成员来避免对setter方法进行额外的方法调用。当CLR编译代码时,它为Get和Set属性创建两个方法,并使用Property访问/修改定义属性的值将导致不必要的额外方法调用(如果不进一步处理该值)。