C#类构造函数默认值问题

本文关键字:问题 默认值 构造函数 | 更新日期: 2023-09-27 17:59:01

我有以下类:

public class Topic
    {
        public string Topic { get; set; }
        public string Description { get; set; }
        public int Count { get; set; }
    }

当使用以下内容创建类时,我希望Count始终设置为零:

var abc = new Topic {
  Topic = "test1",
  Description = "description1"
}

我对构造函数有点困惑。这可能吗?还是在创建abc时需要指定Topic、Description和Count?

C#类构造函数默认值问题

int的默认值为0。

所有值类型都有默认值,因为它们不能是null

请参阅此MSDN页面上的初始化值类型。

您有几个不同的选项。

1) int默认为零,因此如果您不初始化它,它将为零。

2) 你可以使用构造函数

public Topic(){ Count = 0;}

3) 您可以使用后备字段而不是自动属性,并将其初始化为零

 private int _count = 0;
 public int Count {
    get  {return _count}
    set {_count = value; }
 }

Count在初始化时将默认为0,因为它是一种值类型,不能是null

以下这个习语不仅仅是构造函数:

var abc = new Topic {
  Topic = "test1",
  Description = "description1"
}

它是一个构造函数和一个对象初始化器。

实际情况是首先调用new Topic(),从而将所有值初始化为默认值(属性Topic为null,Description为null,Count为0)。之后,值"test1"被分配给Topic,值"description1"被指定给Description。

所有值类型都有一个不同于null的默认值(因为它们不能为null),引用类型默认为null。

公共类程序{公共静态void Main(){

    // Declare a StudentName by using the constructor that has two parameters.
    StudentName student1 = new StudentName("Craig", "Playstead");
    // Make the same declaration by using a collection initializer and sending 
    // arguments for the first and last names. The default constructor is 
    // invoked in processing this declaration, not the constructor that has
    // two parameters.
    StudentName student2 = new StudentName
    {
        FirstName = "Craig",
        LastName = "Playstead",
    };
    // Declare a StudentName by using a collection initializer and sending 
    // an argument for only the ID property. No corresponding constructor is
    // necessary. Only the default constructor is used to process object 
    // initializers.
    StudentName student3 = new StudentName
    {
        ID = 183
    };
    // Declare a StudentName by using a collection initializer and sending
    // arguments for all three properties. No corresponding constructor is 
    // defined in the class.
    StudentName student4 = new StudentName
    {
        FirstName = "Craig",
        LastName = "Playstead",
        ID = 116
    };
    System.Console.WriteLine(student1.ToString());
    System.Console.WriteLine(student2.ToString());
    System.Console.WriteLine(student3.ToString());
    System.Console.WriteLine(student4.ToString());
}
// Output:
// Craig  0
// Craig  0
//   183
// Craig  116

}

公共类StudentName{

// The default constructor has no parameters. The default constructor 
// is invoked in the processing of object initializers. 
// You can test this by changing the access modifier from public to 
// private. The declarations in Main that use object initializers will 
// fail.
public StudentName() { }
// The following constructor has parameters for two of the three 
// properties. 
public StudentName(string first, string last)
{
    FirstName = first;
    LastName = last;
}
// Properties.
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public override string ToString()
{
    return FirstName + "  " + ID;
}

}

编辑

正如我从这个答案的注释中了解到的,在初始化器调用中省略()是完全有效的。

正确的语法应该是我的首选语法仍然是:

var abc = new Topic() {
  Topic = "test1",
  Description = "description1"
}

(注意())。

这将把Count初始化为0,因为0是int的默认值。如果您希望始终指定Topic和Description,请添加一个显式构造函数:

public Topic(string topic, string description)
{
    Topic = topic;
    Description = description;
    // You may also set Count explicitly here, but if you want "0" you don't need to
}