2011-06-14 65 views
11

我有下面的类:C#类的构造函数默认值的问题

public class Topic 
    { 
     public string Topic { get; set; } 
     public string Description { get; set; } 
     public int Count { get; set; } 
    } 

我想有当与下面是创建类伯爵总是被设置为零:

var abc = new Topic { 
    Topic = "test1", 
    Description = "description1" 
} 

我与构造函数有点混淆。当我创建abc时,这是可能的还是需要指定主题,描述和计数?

回答

11

您有几个不同的选项。

1)int默认为零,所以如果您不初始化它将为零。

2)你可以使用一个构造函数

public Topic(){ Count = 0;} 

3)您可以使用支持字段,而不是自动财产和初始化为零

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

一个int的缺省值是0。

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

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

+0

这是个好消息F或者我。如何字符串和布尔。他们是否默认为“”和false? – Geraldo 2011-06-14 12:58:37

+0

@Geraldo - 编号字符串是引用类型,所以它们默认为'null'。 – Oded 2011-06-14 12:59:27

+0

有没有一种方法可以将字符串设置为默认值,还是必须指定每个字符串? – Geraldo 2011-06-14 13:00:36

7

Count将在初始化时默认为0,因为它是值类型,不能是null

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 
} 
+1

-1:关于'()'没有什么需要注意的。 – leppie 2011-06-14 13:02:54

+0

咦? OP没有在他的“构造函数调用”中列出一个空的参数列表 - 我向他指出了这一点,因为我无法使源代码大胆,所以注意到我的变化,以便他更容易看到。那给了我一个-1? – 2011-06-14 13:08:17

+0

@Thorsten Dittmar:不管你在语法中是否有'()',它都没有任何区别。检查IL。 – leppie 2011-06-14 13:12:31

4

这下面的语句不仅是一个构造函数:

var abc = new Topic { 
    Topic = "test1", 
    Description = "description1" 
} 

这是一个构造函数和一个对象初始化。

真正发生的是new Topic()被首先调用,因此将所有值初始化为它们的默认值(属性Topic为null,说明为空,Count为0)。之后,将值“test1”分配给Topic,并将值“description1”分配给Description。

所有值类型都具有不同于null的默认值(因为它们不能为空),并且引用类型默认为null。

0

公共类节目 { 公共静态无效的主要() {

// 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; 
} 

}

+0

KINDLY USE MSDN http://msdn.microsoft.com/en-us/library/bb397680的.aspx#Y255 – amod 2011-06-14 13:16:09