我有以下课程:
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时需要指定主题,描述和计数?
答案 0 :(得分:15)
答案 1 :(得分:11)
您有几种不同的选择。
1)int
默认为零,因此如果你不初始化它将为零。
2)你可以使用构造函数
public Topic(){ Count = 0;}
3)您可以使用支持字段而不是auto-property并将其初始化为零
private int _count = 0;
public int Count {
get {return _count}
set {_count = value; }
}
答案 2 :(得分:7)
Count
默认为0
,因为它是值类型,不能是null
。
答案 3 :(得分:4)
以下这个成语不仅仅是一个构造函数:
var abc = new Topic {
Topic = "test1",
Description = "description1"
}
它是构造函数和对象初始值设定项。
真正发生的是首先调用new Topic()
,因此将所有值初始化为其默认值(属性Topic为null,Description为null,Count为0)。之后,将值“test1”分配给Topic,并将值“description1”分配给Description。
所有值类型的默认值都不为null(因为它们不能为null),引用类型默认为null。
答案 4 :(得分:0)
编辑
正如我从对此答案的评论中了解到的那样,在初始化程序调用中省略()
是完全有效的。
正确的语法是我的首选语法仍然是:
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
}
答案 5 :(得分:0)
公共课程 { 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;
}
}