2010-04-13 70 views
0

为什么在C#3.0中,当我们重载指定类的构造函数时,我们应该在类体中编写默认构造函数?据我所知,没有必要这样做。为什么在C#3.0中,当我们重载指定类的构造函数时,我们应该在类体中编写默认构造函数?

class Test 
{ 
     public int ID {get; private set;} 
     public int Name {get; private set;} 

     public Test() 
     { 
     } 

     public Test(int id, int name) 
     { 
      .... 
     } 

}  

谢谢

+0

“int”类型的'Name'?奇怪的是☺ – Timwi 2010-08-15 00:05:39

回答

2

让我来回答你的问题:为什么我不需要为我的类编写一个单独的构造函数就可以使用?

原因是,当您不写任何构造函数时,C#编译器会为您发出默认构造函数。只是为了让我们更容易。但是,当您指定一个或多个构造函数时,C#编译器会假定您指定了所有需要的构造函数。在这种情况下,它不可能发出默认的构造函数,因为不是所有的类都应该有默认的构造函数。

虽然这个C#特性对于应用程序开发人员来说很好,但对于框架开发人员来说,它可能很烦人。微软的一些团队总是在C#代码中编写默认的构造函数,因为当一个类没有(编写代码的)构造函数时,很容易在下一个版本中添加一个替代构造函数的错误,而不显式指定默认构造函数。在这种情况下,新版本将不兼容,因为默认的构造函数将会丢失。

0

如果你的类是非常有用的(督察你提供一些理智的默认值),那么默认的构造函数是好的,否则它只是为类的用户创造更多的工作和不确定性。

根据你的例子,这是非常没用的,因为你没有访问setter(除非你的类与默认行为)。

1

对于类正在被序列化 - 你的类不能被“再水合”,除非它有一个默认的构造函数。

这是一个例子,当你的类被用在web服务的消息中,或者当它被保存到某种类型的存储中时,比如数据库表或文件。

+0

这是'XmlSerializer'的情况,而不是.NET 3.5中的'DataContractSerializer',它功能更强大(可以将私有属性和字段串行化),但它处理/生成的XML格式的灵活性较差。 – 2010-04-13 10:14:43

+0

BinaryFormatter在没有默认构造函数的情况下也没有问题。 – leppie 2010-04-13 10:16:45

相关问题