如何解决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)您可以使用后备字段代替自动属性,并将其初始化为零
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\"
}
它是一个构造函数和一个对象初始化程序。
真正发生的是首先调用ѭ11,因此将所有值初始化为其默认值(属性Topic为空,Description为null且Count为0)。之后,将值“ test1”分配给主题,并将值“ description1”分配给描述。
所有值类型的默认值都不同于null(因为它们不能为null),而引用类型的默认值为null。
, 公共课程
{
公共静态无效的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\",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;
}
}
, 编辑
正如我从对该答案的注释中了解到的,在初始化调用中省略ѭ14是完全有效的。
正确的语法应为:我的首选语法仍然是:
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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。