我知道我们可以使用构造函数链接从其他构造函数调用参数化构造函数。
但是,
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, world!");
var t1 = new T1("t2");
}
}
public class T1
{
public T1()
{
Console.WriteLine("t1");
}
public T1(string s):base()
{
Console.WriteLine(s);
}
}
这似乎没有调用基础构造函数(没有任何参数)。
有什么想法吗?
编辑:
当前:打印t2。 t1不在控制台上。
所以,我采用了以下方法:
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, world!");
var t1 = new T1("t2");
}
}
public class T1
{
private void privateMethod()
{
Console.WriteLine("common method");
}
public T1()
{
privateMethod();
}
public T1(string s):base()
{
Console.WriteLine(s);
privateMethod();
}
}
有没有更好的方法呢?
答案 0 :(得分:8)
您正在寻找this()
:
public class T1
{
public T1()
{
Console.WriteLine("t1");
}
public T1(string s) : this()
{
Console.WriteLine(s);
}
}
答案 1 :(得分:1)
您正在寻找关键字this
,base
会调用父类(就像您正在扩展的类中一样)。
答案 2 :(得分:1)
当您使用Object()
关键字时,您实际上正在调用base
构造函数。您想使用this
关键字
public class T1
{
public T1()
{
Console.WriteLine("t1");
}
public T1(string s) : this()
{
Console.WriteLine(s);
}
}
答案 3 :(得分:1)
正如其他答案中所提到的,为了调用无参数构造函数,你必须使用:this()
(base()
调用基类的无参数构造函数)
但是,我认为这是一种不好的做法。带有参数的构造函数更好地定义了类的初始化,因此,无参数构造函数应该调用它而不是反之亦然。
即:
public class T1
{
public T1():this(String.Empty) // <= calling constructor with parameter
{
Console.WriteLine("t1");
}
public T1(string s)
{
Console.WriteLine(s);
}
}
而不是:
public class T1
{
public T1()
{
Console.WriteLine("t1");
}
public T1(string s) : this() // <= calling parameterless constructor
{
Console.WriteLine(s);
}
}
顺便说一下,似乎该语言正在鼓励使用主要构造函数,使用,好Primary constructors(这是C#6中的一个实验性功能被删除,不确定是否好......)
答案 4 :(得分:0)
this
在base
父项时调用了当前的类实例。