2012-01-04 13 views
9

は、私のようなクラス内のコンストラクタを呼び出したい: パブリッククラスMyClassの(){クラス内でコンストラクタを呼び出す方法は?

public MyClass(){ 
     //...... 
    } 

    public MyClass(int id):this(){ 
     //...... 
    } 

    private void Reset(){ 
     //..... 
     this = new MyClass(id); //here I want to call constructor 
     //...... 
    } 
} 

が、それは動作しません。それは可能ですか?はいの場合、どうすればいいですか?

+2

なぜあなたはそれをしたいですか?インスタンスメソッドの中で 'this'ポインタを変更することはできません。 –

答えて

10

できません。しかし、あなたができることは、コンストラクタのロジックをInitializeメソッドに分割してリセットしてから呼び出すことです。クラス内

public MyClass(){ 
    //...... 
    } 

    public MyClass(int id):this(){ 
     Initialize(id); 
    } 

    private void Initialize(int id){ 
    //.... 
    } 

    private void Reset(){ 
     //..... 
     Initialize(id); 
     //...... 
    } 
} 
3

これは不可能です。これに割り当てることはできません。

ただしので、呼び出し元のコードが言うことができるMyClassの新しいインスタンスを返すReset()てみましょうことができます:

public class MyClass 
{ 
    public MyClass Reset() 
    { 
     return new MyClass(); 
    } 
} 

MyClass c = new MyClass(); 
c = c.Reset(); 

それとも、すべてのフィールドをデフォルト値に再初期化されるようにResetメソッドを実装することができます。

+0

私は新しいインスタンスを返すReset()という考え方が好きです。その場合、おそらく '静的であるべきです。 –

+2

新しいインスタンスが返された場合、もう何もリセットしていません。新しく作成されたクラスのインスタンスを返します。誤解を招くようなもの。 –

+0

本当に、おそらく 'Create()'がより良いメソッド名になります。 –

14

簡単な回答:できません。

少し複雑な答え:(

public class MyClass 
{ 
    public int? Id { get; } 

    public MyClass() 
    { 
     Initialize(); 
    } 

    public MyClass(int id) 
    { 
     Initialize(id); 
    } 

    public Reset() 
    { 
     Initialize(); 
    } 

    private Initialize(int? id = null) 
    { 
     // initialize values here instead of the constructor 
     Id = id; 
    } 
} 
+1

これは完全に簡潔で明確で、自分の理解を大いに助けました。 – secretwep

2

あなたできコールクラスの内部クラスのコンストラクタ:コンストラクタから呼び出すことができる別の方法にあなたの初期化ロジックを移動して、あなたのReset()方法実際には、これは多くの場合)ファクトリメソッドで行われます。

public class MyClass 
{ 
    public static MyClass Create() 
    { 
     return new MyClass(); 
    } 
} 

しかし、あなたはクラスの内部this参照の値を変更することはできません。代わりに、 "Reset()"メソッドでフィールドをデフォルト値に戻す必要があります。

1

(それが構造体の中に、それは完全に合法だということは注目に値しますが)あなたはthisを再割り当てすることはできません。しかし、質問はであるべきかどうかです。あなたの目標は、すべてのフィールドの値を特定の状態に設定することだと考えています。他の人が既にあなたのResetメソッドを新しいインスタンスに戻すことができる、またはClear()メソッドにロジックを壊すことができ、代わりに。

関連する問題