是否应该在构造函数中使用属性初始化字段

本文关键字:属性 初始化 字段 构造函数 是否 | 更新日期: 2023-09-27 18:03:51

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

的例子:

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;
   }
}

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

是否应该在构造函数中使用属性初始化字段

这里真的没有正确或错误的答案(正因为如此,我几乎想投票结束)。但是,我倾向于同意雅各布的观点。我更喜欢属性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;
   }
}

在c# 3.0引入自动属性之前,我认为你的第二个例子更"合适"。现在使用自动属性,我认为这是最好的:

public class Foo()
{
   private string example;
   public String Example
   {
      { get; set; }
   }
   public Foo(string exampleIn)
   {
      Example = exampleIn;
   }
}

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