C# 构造函数使用私有/公共字段
本文关键字:字段 构造函数 | 更新日期: 2023-09-27 18:21:47
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
}
}
两条线哪一条更标准?
我们在构造函数中使用私有成员还是公共成员?
你可以选择选项 3
public string FirstName {get; set;}
public Student (firstName)
{
FirstName = firstName;
}
这取决于...通常是在您的示例中未包含的内容上。 首先,您的整个属性可以缩短为自动实现的属性:
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;
}
}
在这种情况下,显然您希望构造函数使用属性而不是支持字段,以便在构造对象时应用逻辑。
相反,您可能具有仅在访问资源库时使用而不应在构造对象时使用的逻辑。 在我的头顶上,一个例子可能是维护有关位置信息的对象。 它可能具有 Address 属性和坐标属性,并且每当其中一个发生更改时,都会有一个后端过程来地理定位新值并更新另一个。 但是您可能有一个接受两者的构造函数(也许在从数据库重建现有位置时(,并且在构造期间执行地理位置是没有意义的。 在这种情况下,您将设置支持字段而不是属性。
由于缺乏不使用属性的令人信服的理由,我通常更喜欢使用它们而不是支持字段。 仅仅是因为逻辑可能会添加到所有访问器都应使用的那些属性中。 我还发现属性的名称可能比支持字段更有意义(例如,FirstName
比_firstName
更可读/更有意义(,因此首选是保持代码的其余部分尽可能可读,并首选更可读的名称。
重要的风格选择。就个人而言,我使用公共属性名称,因为我喜欢使用自动属性,在这种情况下这是唯一的选择。使用公共属性可以使我的代码保持一致。
当我编写 POCO(普通的旧 CLR 对象(时,事情是微不足道的,我采用这种方法:
public class POCO
{
public POCO()
{
Name = "Moo-Juice";
}
public string Name { get; set; }
}
在我实际需要成员变量的非平凡情况下,我用 _
作为前缀(相信我,这有助于智能感知 - 并允许您区分成员和局部变量(:
public class NonTrivial
{
private string _name;
public NonTrivial()
{
_name = "Jon Skeet"; // He is non-trivial
}
}
这样,我就可以避免到处this.
污染我的代码。
这取决于:
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = (value=="mycheck")?"default":value;
}
}
如果您的财产有一些验证,那么您应该选择:
public Student (firstName)
{
FirstName = firstName;
}
最常见的是使用该属性,但这是一个选择问题。
特别是在这种情况下,您应该使用自动属性:
public string FirstName { get; set; }
编译器会自动添加支持字段。
还可以选择不添加参数构造函数,因为从 C# 3.5 (IIRC( 开始,可以使用自动初始值设定项:
new Studant() { FirstName = "John Doe" }
它调用构造函数,并在一行中设置属性。
总的来说,我倾向于只为它真正依赖的东西请求一个构造函数参数(参见:依赖注入(,并让并不总是需要的参数可选,直到需要它们,比如在持久之前进行验证。