class Student
{
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value; // Possible logical checks may be implemented here in the future
}
}
public Student (firstName)
{
this.firstName = firstName; // Option 1
// Or
FirstName = firstName; // Option 2
}
}
这两行中哪一行更标准?
我们在构造函数中使用私有成员还是公共成员?
答案 0 :(得分:9)
您可以使用选项3
public string FirstName {get; set;}
public Student (firstName)
{
FirstName = firstName;
}
答案 1 :(得分:4)
这取决于......通常在你的例子中没有包含的内容中。首先,您的整个房产可以缩短为自动实施的房产:
public string FirstName { get; set; }
在这种情况下,这会使问题没有实际意义。除此之外,问题归结为属性中可能存在哪种逻辑(现在或将来)以及构造函数是否需要调用该逻辑。
例如,属性是否在内部检查所需的值或执行其他验证?像这样:
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException("FirstName");
firstName = value;
}
}
在这种情况下,您希望构造函数使用属性而不是支持字段,以便在构造对象时应用逻辑。
相反,您可能具有仅在访问setter时才使用的逻辑,而在构造对象时则不会。在我的脑海中,一个例子可能是一个维护位置信息的对象。它可能有一个Address属性和一个Coordinates属性,每当其中一个更改时,就会有一个后端进程来对新值进行地理定位并更新另一个。但是你可能有一个接受这两者的构造函数(可能在从数据库重新构建现有的Location时),并且在构造期间执行地理定位是没有意义的。在这种情况下,您需要设置支持字段而不是属性。
由于没有令人信服的理由不使用这些属性,我通常更喜欢使用它们而不是支持字段。仅仅因为逻辑可能被添加到所有访问者应该使用的那些属性之后。我还发现这些属性更有可能比支持字段具有更有意义的名称(例如,FirstName
比_firstName
更具可读性/意义)因此首选是保留其余代码尽可能可读,并且更喜欢更易读的名称。
答案 2 :(得分:0)
这是一种风格选择并不重要。就个人而言,我使用公共属性名称,因为我喜欢使用自动属性,在这种情况下,这是唯一的选择。使用公共属性可以保持我的代码一致。
答案 3 :(得分:0)
当我写POCO(普通旧CLR对象)时,事情是微不足道的,我采用这种方法:
public class POCO
{
public POCO()
{
Name = "Moo-Juice";
}
public string Name { get; set; }
}
在我真正需要成员变量的非平凡情况下,我用_
作为前缀(这有助于intellisense,相信我 - 并允许你区分成员和本地人):
public class NonTrivial
{
private string _name;
public NonTrivial()
{
_name = "Jon Skeet"; // He is non-trivial
}
}
这样我就可以避免在任何地方使用this.
来污染我的代码。
答案 4 :(得分:0)
取决于:
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = (value=="mycheck")?"default":value;
}
}
如果您的财产有一些验证,那么您应该去:
public Student (firstName)
{
FirstName = firstName;
}
答案 5 :(得分:0)
最常见的是使用该属性,但这是一个选择问题。
特别是在这种情况下,您应该使用自动属性:
public string FirstName { get; set; }
编译器会自动添加支持字段。
您也可以选择不添加参数构造函数,因为自C#3.5(IIRC)以来,您可以使用自动初始化程序:
new Studant() { FirstName = "John Doe" }
调用构造函数,并将属性设置为一行。
总的来说,我倾向于只为它真正依赖的东西请求一个构造函数参数(参见:dependency injection),并且在需要之前让并不总是需要它们,比如在持久化之前进行验证。