C#建造商链接澄清

C#建造商链接澄清,c#,constructor,C#,Constructor,我有一个C#代码: 当我调用传递了对象的构造函数时,会发生什么?我似乎无法掌握一连串的事件。如果要传递一个对象,它也会调用另一个构造函数 假设您有三个构造函数,其中两个带有this()。调用这两个函数中的任何一个都会调用没有this()的构造函数吗?我错过什么了吗?据我所知,它只是强调干的构造函数重载 本质上,它总是调用默认值 只要在我的思维中进行一些验证/纠正,就会大有帮助 谢谢 编辑: 如果没有要传递的lName(第三个参数),它如何调用构造函数 班级学生{ 字符串_studentType=

我有一个C#代码:

当我调用传递了对象的构造函数时,会发生什么?我似乎无法掌握一连串的事件。如果要传递一个对象,它也会调用另一个构造函数

假设您有三个构造函数,其中两个带有
this()
。调用这两个函数中的任何一个都会调用没有this()的构造函数吗?我错过什么了吗?据我所知,它只是强调干的构造函数重载

本质上,它总是调用默认值

只要在我的思维中进行一些验证/纠正,就会大有帮助

谢谢

编辑:

如果没有要传递的lName(第三个参数),它如何调用构造函数

班级学生{
字符串_studentType=“”;
字符串_id=“”;
字符串_fName=“”;
字符串_lName=“”;
公立学生(字符串id)
:此(id“,”){
}
公立学生(字符串id、字符串fName)
:此(id,fName,“”){
}
公立学生(字符串id、字符串fName、字符串lName){
//验证逻辑。。。。。
_studentType=“”;
_id=id;
_fName=fName;
_lName=lName;
}
}
编辑2:

我现在理解了默认设置,这更有意义。我的问题是,如果没有所有参数,它如何调用构造函数

当我调用传递了对象的构造函数时,会发生什么

执行链将首先调用无参数构造函数this()。一旦完成,它将执行构造函数,获取
对象
重载

如果要传递一个对象,它也会调用另一个构造函数

是的,因为您指示它使用
:this()

假设您有三个构造函数,其中两个使用this()。调用这两个函数中的任何一个都会调用没有此()的构造函数吗

除非你如此明确地陈述。使用
this
的两个构造函数会,没有的第三个不会。

this()
在链式执行的构造函数之前被调用。然后将调用链接构造函数

一种常见的示例构造函数链接涉及提供合理的默认值,如下所示:

class SomeData
{
    private string _string;
    private int _int; 

    public SomeData() : this("Default", 42)
    {

    }

    public SomeData(string str) : this(str, 42)
    {

    }

    public SomeData(string str, int num)
    {
        _int = num;
        _string = str; 
    }
}
这将允许
SomeData
的用户使用任何构造函数实例化它

可以说,使用可选参数,可以更好地解决这一问题:

public SomeData(string str = "Default", int num = 42) { } 

对于
SomeData
的链式构造函数,如果调用
SomeData()
,则首先调用
SomeData(string,num)
。返回后,
SomeData
无参数构造函数可以访问链式构造函数所做的修改

调用
ExpenseReportPage(someContext)
时,首先调用的是空构造函数的主体。然后调用parameterfull构造函数的主体,并将
数据
存储在
数据上下文
属性中。那么它将调用空的主体,然后调用带有数据参数的主体?如果空的不是空的,它会做什么?如果现在为空的构造函数接受了另一个构造函数没有的参数,该怎么办?(假设它们是在别处初始化的)不管空的是空的还是非空的或其他什么。链式构造函数总是在链接到它们的构造函数体之前被调用。“如果没有lName(第三个参数)要传递,它如何调用构造函数?”是什么意思?什么是“it”?如果当前的无参数构造函数实际上有两个参数,一个没有,假设它是在别处初始化的,该怎么办?以我的编辑为例。如果它有两个参数,它就不是无参数的。我不确定我是否理解你的问题。回答得很好,谢谢。对不起,我重写了,意思是目前没有参数的。第二个例子更好地说明了我的问题。如果没有lName可传递,它将如何调用构造函数?@shenk还不清楚你的意思。“如果没有
lName
可通过”是什么意思?你的意思是你只传递两个参数?在这种情况下,您将调用第二个构造函数(它链接到第三个构造函数,并为
lName
传递一个空字符串)。如果你的意思是别的,请澄清一下。我对默认设置感到困惑。我现在知道了。如果调用SomeData(),参数str和num会发生什么变化?它们从未被传递,那么它如何调用某些数据(string str,in num)?是的,它们是-链式调用
:这个(“默认”,42)
就是这样做的。哦,这很有意义。因此,即使从未调用SomeData(stringstr),默认值仍然适用?哦,我明白了,每个都设置了默认值。这是正确的,因为它是
SomeData
class SomeData
{
    private string _string;
    private int _int; 

    public SomeData() : this("Default", 42)
    {

    }

    public SomeData(string str) : this(str, 42)
    {

    }

    public SomeData(string str, int num)
    {
        _int = num;
        _string = str; 
    }
}
public SomeData(string str = "Default", int num = 42) { }