c#在构造函数内部或外部声明变量

c#在构造函数内部或外部声明变量,c#,C#,我试图理解构造函数内部或外部类的变量声明的区别。在本例中,创建等级列表。对我来说,下面的方法达到了相同的结果,因此建议采用这种方法,有什么理由让我这样做吗?我有一种方法被注释掉了,另一种没有 class Book { //List<double> grades; List<double> grades = new List<double>(); public Book() { //Why not declare

我试图理解构造函数内部或外部类的变量声明的区别。在本例中,创建等级列表。对我来说,下面的方法达到了相同的结果,因此建议采用这种方法,有什么理由让我这样做吗?我有一种方法被注释掉了,另一种没有

class Book
{
    //List<double> grades;
    List<double> grades = new List<double>();
    public Book()
    {
        //Why not declare it here?
        //grades = new List<double>();
    }

    public void AddGrade(double grade)
    {
        grades.Add(grade);
    }
}
教材
{
//列出职系;
列表等级=新列表();
公共书籍()
{
//为什么不在这里申报呢?
//等级=新列表();
}
公共交通等级(双等级)
{
等级。添加(等级);
}
}

这里有相当大的个人意见空间,但一般来说:

  • 在同一行中声明和初始化字段有助于验证字段是否已初始化,而无需查看多个位置。如果看到声明的字段没有初始值设定项,则必须查看代码的不同部分,以查看该项是否正在初始化
  • 在某些情况下(如初始值基于构造函数参数),无法初始化字段内联。由于有时需要在构造函数中初始化字段,有些人会认为总是在构造函数中初始化字段更为一致
  • 您可能还想问:我是否应该要求/允许在构造函数中提供初始值

        class Book
        {
            readonly List<double> grades;
            public Book() : this(Array.Empty<double>())
            {
            }
    
            public Book(IEnumerable<double> grades)
            {
                this.grades = grades.ToList();
            }
    
            public void AddGrade(double grade)
            {
                grades.Add(grade);
            }
        }
    

    @R.J.Dunnill嗯,不,根本不是这样。@R.J.Dunnill:看看注释掉的行,我认为OP的意思是为什么不将声明从初始化中分离出来。您在这里描述的两种方法在功能上是相同的。在实践中,更重要的是保持一致性,而不是担心其他任何事情。@R.J.Dunnill是的,你的评论是完全错误的。最大的区别是当有多个构造函数时。在一个地方初始化一个类成员很好。如果没有指定字段,则该字段将被初始化为该类型的默认值。另外需要注意的是初始化的顺序。如果我没记错的话,在第行中初始化的字段(即,在构造函数之外)会被初始化,就像代码在正在运行的构造函数前面一样。@R.J.Dunnill:是的,从技术上讲是这样的。我通常认为
    null
    -初始化字段实际上是未初始化的。是的,它不是很有用。@Flydog57是的,您记得正确。
        class Book
        {
            public List<double> Grades {get;} = new List<double>();
        }