【问题标题】:.Net how to make a constructor for a partial class?.Net 如何为部分类创建构造函数?
【发布时间】:2016-11-15 05:19:27
【问题描述】:

我有一个带有构造函数的局部类,但构造函数抛出错误,因为“已经声明了具有相同签名的成员”(另一个局部类中存在同名的构造函数)。当名称已被使用时,如何为部分类创建构造函数?

public partial class DigitalArchivesAssetsDataContext
{
    public DigitalArchivesAssetsDataContext()
        : base(System.Configuration.ConfigurationManager.ConnectionStrings["digitalArchivesAssets"].ConnectionString, mappingSource)
    {
        OnCreated();
    }
}

【问题讨论】:

  • 如果构造函数签名相同,为什么在两个不同的部分类中需要它?最终,部分类将被编译,就好像它们是在同一个类中编写的一样。
  • 您的班级中不能有重复的成员。 Partial 只不过是允许编译器从多个文件编译类,但同样的编码原则也适用,包括没有重复的成员(包括构造函数)。
  • 您在代码中显示的方法是现有方法还是您要添加的方法?如果它已经存在,那么它的目的是利用OnCreated 添加您想要在调用构造函数时执行的自定义代码。如果是这种情况,它可能是您可以覆盖的部分方法、事件或虚拟方法。

标签: c# asp.net .net constructor partial-classes


【解决方案1】:

你不能。编译器本质上是在构建项目时将所有分部类的文本合并为一个类。每个类不能有多个具有相同名称和签名的方法(包括构造函数)。

一种选择是为构造函数使用不同的签名,或者修改您的架构以不需要构造函数。例如,您可以使用现有的构造函数并拥有某种Initialize 方法来运行来自其他构造函数的代码。

您也可以使用“部分方法”。这些是标记为partial 的方法,您可以从现有构造函数“如果它们存在”调用它们。它们被设计为来自代码生成器的部分类的扩展点,但您也可以使用它们。请参阅MSDN 了解更多信息。

【讨论】:

    【解决方案2】:

    您不能在拆分的部分类中创建具有匹配签名的多个构造函数,因为在编译时这两个部分会合并在一起以生成单个类文件。例如

    class ClassRoom
    {
    private int boycount;   //field
    public ClassRoom()     //default constructor
    {
        boycount = 30;
    }
    public ClassRoom(int bcount)     //overloaded constructor
    {
        boycount = bcount;
    }
    public double Avg()     //method
    {
        //statements goes here
    }
    }
    

    在上面的例子中,我们可以像这样拆分类。

    //Calculation1.cs
    partial class ClassRoom
    {
    private int boycount;   //field
    
    public ClassRoom()     //default constructor
    {
        boycount = 30;
    }
    }
    //Calculation2.cs
    partial class ClassRoom
    {
    public ClassRoom(int bcount)     //overloaded constructor
    {
        boycount = bcount;
    }
    public double Avg()     //method
    {
        //statements goes here
    }
    }
    

    希望清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多