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

时间:2011-06-14 12:55:20

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

6 个答案:

答案 0 :(得分:15)

int的默认值为0.

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

请参阅此MSDN页面上的Initializing Value Types

答案 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;
}

}