C#构造函数使用私有/公共字段

yaz*_*pro 3 c#

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

     }
 }
Run Code Online (Sandbox Code Playgroud)

哪两条线更标准?

我们在构造函数中使用私有成员还是公共成员?

Say*_*yse 9

你可以选择3

 public string FirstName {get; set;}
 public Student (firstName)
 {
     FirstName = firstName;
 }
Run Code Online (Sandbox Code Playgroud)

  • 这不是本质上的选择2吗? (2认同)

Dav*_*vid 5

这取决于...通常取决于您的示例中未包含的内容。一方面,您的整个属性可以缩短为自动实现的属性:

public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这会使问题变得毫无意义。除此之外,问题归结为属性中可能存在什么样的逻辑(现在或将来),以及该逻辑是否需要由构造函数调用。

例如,该属性是否在内部检查所需值或执行其他一些验证?像这样的东西:

private string firstName;
public string FirstName
{
    get { return firstName; }
    set
    {
        if (string.IsNullOrWhiteSpace(value))
            throw new ArgumentNullException("FirstName");
        firstName = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,显然您希望构造函数使用属性而不是支持字段,以便在构造对象时应用逻辑。

相反,您可能拥有只应在访问 setter 时使用而在构造对象时不应该使用的逻辑。在我的脑海中,一个例子可能是一个保存有关位置信息的对象。它可能有一个 Address 属性和一个 Coordinates 属性,只要其中一个属性发生变化,就会有一个后端进程来对新值进行地理定位并更新另一个。但是您可能有一个接受两者的构造函数(可能在从数据库重新构建现有位置时),并且在构建期间执行地理定位是没有意义的。在这种情况下,您将设置支持字段而不是属性。

由于缺乏不使用属性的令人信服的理由,我通常更喜欢使用它们而不是支持字段。仅仅是因为逻辑可能会在以后添加到所有访问器都应该使用的属性中。我还发现这些属性的名称比支持字段更有意义(例如,FirstName比 更易读/更有意义_firstName),因此首选将保持其余代码尽可能可读,并更喜欢更易读的名称.