应该使用属性来初始化构造函数中的字段吗?
真的很简单的问题,我应该使用我的属性初始化构造函数中的字段或直接引用它们?应该使用属性来初始化构造函数中的字段吗?
例子:
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;
}
}
无论哪种方式,我不认为任何违反封装,所以我想知道是否有一个首选去哪里?
在C#3.0中引入自动属性之前,我认为您的第二个示例更“合适”。现在有了自动属性,我认为这是最好的:
public class Foo()
{
private string example;
public String Example
{
{ get; set; }
}
public Foo(string exampleIn)
{
Example = exampleIn;
}
}
实在是没有正确或错误的答案在这里(正因为如此,我几乎想投票关闭)。但是,我倾向于同意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;
}
}
好点,谢谢你的洞察力。 – 2013-03-15 18:00:41
这取决于是否数据值将进一步设置器内进行处理。如果值需要处理,那么最好使用@Jacob所说的内容,但如果值不会被进一步处理(在大多数情况下就是这种情况),最好使用私有成员来避免对setter方法的额外方法调用。当CLR编译代码时,它会为Get和Set属性创建两个方法,并使用Property访问/修改定义该属性的值将导致不必要的额外方法调用(如果该值未被进一步处理)。
谢谢,我想了很多,但只是好奇,看看有没有什么“标准”,因为C#3.0使这很容易做到。 – 2013-03-14 17:43:10