4

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

例子:

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

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

4

3 回答 3

2

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

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

public class Foo()
{
   private string example;

   public String Example
   {
      { get; set; }
   }

   public Foo(string exampleIn)
   {
      Example = exampleIn;
   }
}
于 2013-03-14T17:30:32.860 回答
0

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

于 2015-10-09T10:17:28.063 回答