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
     }
 }

两条线哪一条更标准?

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

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

你可以选择选项 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" }

它调用构造函数,并在一行中设置属性。

总的来说,我倾向于只为它真正依赖的东西请求一个构造函数参数(参见:依赖注入(,并让并不总是需要的参数可选,直到需要它们,比如在持久之前进行验证。