2013-03-14 65 views
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; 
    } 
} 

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

回答

0

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

public class Foo() 
{ 
    private string example; 

    public String Example 
    { 
     { get; set; } 
    } 

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

谢谢,我想了很多,但只是好奇,看看有没有什么“标准”,因为C#3.0使这很容易做到。 – 2013-03-14 17:43:10

2

实在是没有正确或错误的答案在这里(正因为如此,我几乎想投票关闭)。但是,我倾向于同意Jacob。我更喜欢属性getter和setter路由,特别是现在我们拥有自动属性。请记住,如果因为任何原因影响您的决定,您可以对获取者和设置者进行不同的访问修改。我的意思是,如果你打算在构造函数中使用该属性,那么尽量保持一致,并且只能在课程中的其他地方使用它。这可能意味着你不想让接触者暴露在外面。

public class Foo() 
{ 
    private string example; 

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

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

好点,谢谢你的洞察力。 – 2013-03-15 18:00:41

0

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

相关问题