2009-03-20 3 views
4

次のように私は2つのコンストラクタを持つクラスを持っている場合:コンストラクタが最初のコンストラクタに与えられたオブジェクトを使って別のコンストラクタを呼び出すと、nullをチェックできますか?

class Foo 
{ 
    public Foo(string name) 
    {...} 

    public Foo(Bar bar): base(bar.name) 
    {...} 
} 

私はnull参照の例外を取得する前にバーがnullであるかどうかを確認することができますいくつかの方法がありますか?

答えて

3

はこれを行うには、静的メソッドを使用することができます。

class Foo 
{ 
    pubic Foo(string name) 
    {...} 

    public Foo(Bar bar): base(GetName(bar)) 
    {...} 

    static string GetName(Bar bar) { 
     if(bar==null) { 
      // or whatever you want... 
      throw new ArgumentNullException("bar"); 
     } 
     return bar.Name; 
    } 
} 
+0

これは恐ろしいと間違っているしたい場合は例外ArgumentNullExceptionを投げます。構築中に例外をスローすると、オブジェクトが正常に構築されなかったことを意味します。これは、デストラクタが呼び出されないことを意味します。 DOを適切に処理する必要があるリソースを既に割り当てている場合は、クラスを微妙にデバッグするのが難しくなりました。建設中の例外:ちょうどいいえと言う。 nameがnullの場合、Fooは代わりにbarfを使うべきではありません。あるいは、名前設定コードを両方のコンストラクターが呼び出せるスタティックに抽出することもできます。 –

+1

@Dirk meh、約99.99%のC#クラス*にはファイナライザがありません –

+1

true、これはほんの0.01%です。 –

1
public Foo(Bar bar): base(bar == null ? "" : bar.name) 
{...} 
2
class Foo 
{ 
    public Foo(Bar bar): base(bar == null ? default(string) : bar.name) 
    { 
     // ... 
    } 
} 

代わりバークラスのオブジェクトを持つバークラスハンドルを聞かせて、あなたが

+0

この方法はうまくいくようですが、簡単な理由の1つとして、静的なバージョンを答えとして選択しました。特に、私はバークラスの4つのプロパティにアクセスする必要があるので、コンストラクタを非常に判読不能にするでしょう。 –

+0

:)これは大丈夫です...私はむしろバーオブジェクトを扱うバークラスのctorになりがちです。 ! –

関連する問題