C# 3.0 为什么在C#3.0中,当我们重载指定类的构造函数时,我们应该在类体中编写默认构造函数?

C# 3.0 为什么在C#3.0中,当我们重载指定类的构造函数时,我们应该在类体中编写默认构造函数?,c#-3.0,constructor,overloading,default-constructor,C# 3.0,Constructor,Overloading,Default Constructor,为什么在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) { ....

为什么在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)
      {
           ....
      }

}    
谢谢你

如果你的类是有用的(虽然你提供了一些合理的默认值),那么默认构造函数是好的,否则它只会给类的用户带来更多的工作和歧义

根据您的示例,它是非常无用的,因为您没有访问setter的权限(除非您的类以默认值运行)。

如果您的类是有用的(虽然您提供了一些合理的默认值),那么默认构造函数是好的,否则它只会为类的用户创建更多的工作和歧义


根据您的示例,它是非常无用的,因为您没有访问setter的权限(除非您的类以默认值运行)。

因为当类被序列化时,您的类不能被“重新水化”,除非它具有默认构造函数


这方面的一个例子是,当您的类被用于与Web服务之间的消息时,或者当它被保存到某种存储中(如数据库表或文件)时。

因为当类被序列化时,您的类不能被“重新水化”,除非它具有默认构造函数


这方面的一个例子是,当您的类被用于与Web服务之间的消息时,或者当它被保存到某种存储中(如数据库表或文件)时。

让我把您的问题转过来:为什么我不为我的类编写一个可用的构造函数呢

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


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

让我把你的问题转过来:为什么我不为我的类编写一个可用的构造函数呢

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


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

这是.NET 3.5中的
XmlSerializer
的情况,而不是更强大的
DataContractSerializer
(您可以序列化私有属性和字段)但是,它处理/生成的XML的格式不太灵活。如果没有默认构造函数,BinaryFormatter也不会有问题。在.NET 3.5中,
XmlSerializer
就是这种情况,而.NET 3.5中的
DataContractSerializer
功能更强大(您可以序列化私有属性和字段)但是,它处理/生成的XML格式不太灵活。如果没有默认构造函数,BinaryFormatter也没有问题。类型为
int
Name
?奇怪的☺类型为
int
名称
?奇怪的☺