【问题标题】:Why do we declare a private parameterless constructor every time为什么每次都要声明一个私有的无参构造函数
【发布时间】:2012-07-10 17:12:08
【问题描述】:

我在我的项目中看到了这一点

 class Product
 {
    public string Name { get; private set; }
    public decimal Price { get; private set; }
    public Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
    Product() {}
    public static List<Product> GetSampleProducts()
    {
        return new List<Product>
          {
             new Product { Name="West Side Story", Price = 9.99m },
             new Product { Name="Assassins", Price=14.99m },
             new Product { Name="Frogs", Price=13.99m },
             new Product { Name="Sweeney Todd", Price=10.99m}
          };
    }
    public override string ToString()
    {
        return string.Format("{0}: {1}", Name, Price);
    }
 }

【问题讨论】:

  • 我认为你需要提供更多关于context的信息,尤其是关于你看过哪些项目。

标签: asp.net-mvc-3 c#-4.0 entity-framework-4 c#-3.0


【解决方案1】:

一旦你创建了一个带参数的构造函数,你的默认无参数构造函数就消失了。现在,如果您希望在不提供任何值的情况下初始化对象,则必须显式声明无参数构造函数。这取决于您要如何使用它,如果您希望仅使用这些值初始化对象,并且如果您的对象无效则不使用它们,则不要添加无参数构造函数。但是,如果带参数的构造函数只是用一些值初始化对象的一种方式,那么您始终可以像使用 C# 3.0 Object Initializer 一样初始化对象,如下所示

 var product = new Product{Name = "Some Name", Price = 10.0};

【讨论】:

    【解决方案2】:

    ORM 映射器、反序列化等需要它来自动创建对象。

    Product() {}
    

    是内部的,不是私有的。

    【讨论】:

      【解决方案3】:

      可能是因为序列化。

      如果您的对象没有无参数构造函数,那么大多数通过反射工作的反序列化器将无法创建对象的实例,因为它不知道要传递哪些参数。

      我经常通过添加 Obsolete 属性来明确这一点:

      [Obsolete("This constructor is for deserialization only", true)]
      private Product() { }
      

      【讨论】:

        猜你喜欢
        • 2019-11-05
        • 2023-04-09
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多