3
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

     }
 }

两条线哪一条更标准?

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

4

6 回答 6

9

你可以选择选项 3

 public string FirstName {get; set;}
 public Student (firstName)
 {
     FirstName = firstName;
 }
于 2013-07-10T18:27:31.210 回答
5

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

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 属性和一个 Coordinates 属性,并且每当其中一个发生更改时,都会有一个后端进程来定位新值并更新另一个。但是您可能有一个同时接受两者的构造函数(可能在从数据库重新构建现有位置时),并且在构造过程中执行地理定位是没有意义的。在这种情况下,您将设置支持字段而不是属性。

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

于 2013-07-10T18:35:20.963 回答
0

这取决于:

 private string firstName;
 public string FirstName
 {
    get
    {
        return firstName;
    }
    set
    {
        firstName = (value=="mycheck")?"default":value;
    }
 }

如果您的财产有一些验证,那么您应该选择:

 public Student (firstName)
 {
     FirstName = firstName;
 }
于 2013-07-10T18:32:45.330 回答
0

这是一个无关紧要的风格选择。就个人而言,我使用公共属性名称,因为我喜欢使用自动属性,在这种情况下这是唯一的选择。使用公共属性使我的代码保持一致。

于 2013-07-10T18:28:08.247 回答
0

当我编写一些琐碎的 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.到处污染我的代码。

于 2013-07-10T18:30:38.597 回答
0

最常见的是使用属性,但这是一个选择问题。

特别是在这种情况下,您应该使用自动属性:

public string FirstName { get; set; }

并且编译器会自动添加支持字段。

您也可以选择不添加参数构造函数,因为从 C# 3.5 (IIRC) 开始,您可以使用自动初始化器:

new Studant() { FirstName = "John Doe" }

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

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

于 2013-07-10T18:35:23.073 回答