C# 如何调用构造函数初始值设定项base()和this()?

C# 如何调用构造函数初始值设定项base()和this()?,c#,constructor,C#,Constructor,这很容易解决,但我只是好奇我是否可以使用语言功能,或者语言不允许这一事实是否意味着我在类设计中犯了逻辑错误 我正在对我的代码进行自我审查,以帮助“强化”代码以供重复使用,我刚刚偶然发现: public partial class TrackTyped : Component { IContainer components = null; public TrackTyped() : base() { InitializeComponent(

这很容易解决,但我只是好奇我是否可以使用语言功能,或者语言不允许这一事实是否意味着我在类设计中犯了逻辑错误

我正在对我的代码进行自我审查,以帮助“强化”代码以供重复使用,我刚刚偶然发现:

public partial class TrackTyped : Component
{
    IContainer components = null;

    public TrackTyped()
        : base()
    {
        InitializeComponent();
    }

    public TrackTyped(IContainer container)
        : base()
    {
        container.Add(this);
        InitializeComponent();
    }
}
当我在两个构造函数中看到同一行代码时,我通常会使用“this()”来调用另一行代码,但我似乎不能这样做

如果我正确地阅读了规范(我刚刚开始尝试阅读规范,因此可能不正确):

这是说我只能拥有其中的一个


问题:10.11是否意味着没有理由同时调用这两个函数,还是仅仅意味着该语言只支持调用一个函数?

没有必要同时调用这两个函数,因为
重定向到另一个将调用
的构造函数,这就是您要寻找的吗

public partial class TrackTyped : Component
{
    IContainer components = null; 
    public TrackTyped() : base()
    {
        // logic for InitializeComponent() here
    } 

    public TrackTyped(IContainer container) : this()
    {
        container.Add(this)
    }
}
顺便说一句:这是第二个ctor的一个有趣用法:

var a = TrackTyped(container);
我想知道删除第二个ctor并这样做是否对您更清晰?(最终结果相同)


你没有,你不能。您可以通过
:this(…)
将构造函数调用转发给同一类的另一个构造函数。该链中的最后一个构造函数必须通过
:base(…)


假设类A有两个构造函数。一个用
:base(2)
初始化base,另一个用
:base(3)
初始化base。如果允许第一个构造函数也指定
:这个(/*调用另一个构造函数*/)
如何初始化基:使用2或3?这就是为什么这些东西是不允许的

这似乎是你想要的:

public partial class TrackTyped : Component
{
    IContainer components = null;

    public TrackTyped()
        : base()
    {
        InitializeComponent();
    }

    public TrackTyped(IContainer container)
        : this()
    {
        container.Add(this);
    }
}
不过,第二个构造函数中语句的顺序现在不同了。如果这很重要,那么就没有真正好的方法来做你想做的事情,因为即使你有相同的产品线,功能也有细微的不同。在这种情况下,只需重复一行即可。别担心


您正确地阅读了规范:它必须是一个或另一个。

通常在一个类中完成,该类有多个属性要通过构造函数初始化,其中一些属性是可选的。 我们有一个最大的构造函数,它接受所有调用基本构造函数的参数。所有其他构造函数通过向这个大构造函数传递null/默认值重定向到此构造函数。这样,所有初始化代码都保留在一个地方,可供其他人重用

public MissingEntityException(Type type, string criteria, string message = "") 
    : this(type, criteria, message, null)
{           
}

public MissingEntityException(Type type, string criteria, string message, Exception innerException) 
     : base(message, innerException) 
{
    this.EntityType = type;
    this.Criteria = criteria;
}

这是跨层次结构支持的,可以涉及任何数量或参数。

感谢大家的回答(现在很明显,一分钟前对我来说不是很明显):)不,我只是因为某种原因自己没有想到答案-我不认为容器。添加(这)需要在初始化组件()之前进行-如果是这样,我可能会问自己这是否是wierd design的标志。在示例中,“new TrackedType()”首先执行,然后是.Add()。就我个人而言,我觉得这样更清楚。也许以后要记住它。你说得很好,所以我深入研究了一个层次,发现原因是让我的组件可以与Winforms designer一起使用,Winforms designer会自动向包含组件的初始化例程添加一行,如下所示:this.trackTypedTextComponent1=new EomApp1.Components.TrackTyped(this.Components);
public partial class TrackTyped : Component
{
    IContainer components = null;

    public TrackTyped()
        : base()
    {
        InitializeComponent();
    }

    public TrackTyped(IContainer container)
        : this()
    {
        container.Add(this);
    }
}
public MissingEntityException(Type type, string criteria, string message = "") 
    : this(type, criteria, message, null)
{           
}

public MissingEntityException(Type type, string criteria, string message, Exception innerException) 
     : base(message, innerException) 
{
    this.EntityType = type;
    this.Criteria = criteria;
}