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