我是CSharp的新手。我在某些代码中看过“this()”。我的问题是假如我打电话
Paremeterized构造函数,我是否强行调用paremeterless构造函数?。但是根据构造函数构造,我相信无参数构造函数将首先被执行。您能用简单的示例解释这个,这样我才能准确地知道何时应该调用“this ()“。提前致谢。
public OrderHeader() { }
public OrderHeader(string Number, DateTime OrderDate, int ItemQty)
: this()
{
// Initialization goes here ....
}
答案 0 :(得分:6)
好吧,如果你想调用无参数构造函数,你应该使用this()
,就像那样简单。
例如,如果你有两个构造函数,其中无参数初始化Id
并且参数完全初始化Name
,你应该使用this
,这样你就不会重复:
public Foo()
{
Id = ComputeId();
}
public Foo(string name)
: this()
{
Name = name;
}
另一方面,如果paramterfull构造函数是初始化Id
的另一种方法,则不必调用this()
:
public Foo()
{
Id = ComputeId();
}
public Foo(int id)
{
Id = id;
}
此语法也不限于无参数构造函数,您可以以相同的方式调用任何其他构造函数:
public Foo(int id, string name)
: this(id)
{
Name = name;
}
答案 1 :(得分:6)
默认情况下(对于类),有一个隐式:base(),所以它总是链接某些东西。添加:this()调用当前类型的无参数构造函数,依此类推 - 迟早会调用某种基本构造函数。是的,:this(...)或:base(...)在构造函数体之前发生。
在显示的示例中,添加:this()没有任何危害,但也没有任何用处。在更复杂的场景中,:this(...)通常用于避免重复构造函数代码 - 通常将所有构造函数指向最参数化的版本 - 例如:
public Foo() : this(27, "abc") {} // default values
public Foo(int x, string y) {...validation, assignment, etc...}
答案 2 :(得分:1)
默认情况下,不会首先执行无参数构造函数 - 编译器将仅使用您明确调用的构造函数。如果由于某种原因需要调用无参数构造函数,请使用this()
。
如果删除this()
,则可以在下面的示例中看到差异。
class Test
{
public int x;
public int y;
public Test()
{
x = 1;
}
public Test(int y) : this() // remove this() and x will stay 0
{
this.y = y;
}
class Program
{
static void Main(string[] args)
{
var t = new Test(5);
Console.WriteLine("x={0} y={1}", t.x, t.y);
}
}
正如另一个答案中所提到的 - 调用无参数构造函数的规则首先应用于base()
关键字。如果您未提供要调用的基础构造函数,则编译器将尝试调用无参数构造函数。
答案 3 :(得分:0)
构造函数链接!
要记住的重要部分是调用链的顺序。
public OrderHeader() { //Executed First
_number = "";
_orderDate = DateTime.Now();
}
public OrderHeader(string Number)
: this()
{
_number = Number;
}
public OrderHeader(string Number, DateTime OrderDate, int ItemQty)
: this(Number)
{
_orderDate = OrderDate;
_itemQty = ItemQty;
}