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

我有以下课程:

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时需要指定主题,描述和计数?

你有几个不同的选择。

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

2)您可以使用构造函数

 public Topic(){ Count = 0;} 

3)您可以使用支持字段而不是auto-property并将其初始化为零

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

int的默认值为0。

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

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

初始化时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。

public class Program {public static 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的默认值。 如果您想要始终指定主题和描述,请添加显式构造函数:

 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 }