2016-08-01 268 views
0

我知道我们可以使用构造函数链从其他构造函数调用参数构造函数。从C#中的参数化构造函数调用无参数构造函数?

但是,

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(); 

    } 
} 

是否有这样做的更好的方法呢?

+1

这里的基类在哪里? –

+2

@MrinalKamboj - 他们打算使用'this'并且错误地将'base'指向T1构造函数。在这种情况下,'base'实际上是System.Object' – keyboardP

+2

OP,快速调试提示 - 在Visual Studio中,单击'base()'并按F12。你会看到它指的是什么。现在将它换成'this()',然后按F12,你会发现它现在引用了'T1'构造函数。如果您没有获得您期望的编程流程,请逐行逐行进行,这有助于找出问题的根源。 – keyboardP

回答

8

您正在寻找this()

public class T1 
{ 
    public T1() 
    { 
     Console.WriteLine("t1"); 
    } 

    public T1(string s) : this() 
    { 
     Console.WriteLine(s); 
    } 
} 
+0

你说得对..我很傻..谢谢:) –

1

您正在寻找的关键字thisbase会调用父类(如你扩展类)。

1

当您使用base关键字时,实际上您正在调用Object()构造函数。你想使用this关键字

public class T1 
{ 
    public T1() 
    { 
     Console.WriteLine("t1"); 
    } 

    public T1(string s) : this() 
    { 
     Console.WriteLine(s); 
    } 
} 
+0

很好的解释,对于第1行,当你使用** base **关键字时,你正在调用Object()构造函数 –

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中删除了,不确定是否为好......)

0

this调用当前类实例,而base父母。