2016-08-01 9 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'を使うことを意図していて、T1コンストラクタを参照している' base'を間違って考えていました。この場合、 'base'は実際には' System.Object'です。 – keyboardP

+2

OP、クイックデバッグのヒント - Visual Studioで 'base()'をクリックし、F12を押します。それが何を指しているかが分かります。今度は 'this()'と入れ替えてからF12を押すと、 'T1'コンストラクタを参照するようになります。期待しているプログラミングフローが得られない場合は、1行ずつステップを実行すると、問題の原因を特定するのに役立ちます。 – keyboardP

答えて

8

あなたはthis()を探しています:あなたは、キーワードthisを探している

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

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

あなたは正しいです..私の愚かな..ありがとうございました:) –

1

baseは(あなたが拡張しているクラスのように)親クラスを呼び出します。

1

baseキーワードを使用すると、実際にはObject()コンストラクタが呼び出されます。あなたは:this()しかし

base()は、基本クラスのパラメータなしのコンストラクタを呼び出す)を使用する必要があるパラメータなしのコンストラクタを呼び出すために、他の回答で述べたようにthisキーワード

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

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

あなたは** base **キーワードを使用すると、Object()コンストラクタを呼び出しています。 –

1

を使用したい、私はこれを考えます悪い習慣です。のパラメータを持つコンストラクタは、クラスの初期化をよりよく定義するものであるため、パラメータのないコンストラクタはその逆を呼び出す必要があります。

すなわち:

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

thisbase親。

関連する問題