2016-09-07 8 views
3

は、次のクラスを考えてみましょうコード(bar = nullとします)。使用のデフォルトのプロパティ値

コンストラクタの初期化子がデフォルトのプロパティ値を使用するようにしてください(例:barnullの場合)。

if (bar == null) { 
    foo = new Foo(); 
} else { 
    foo = new Foo { Bar = bar }; 
} 

それとも

foo = new Foo(); 
if (bar != null) 
    foo.Bar = bar; 
+0

はちょうどその値を代入しませんか? 'if(bar!= null){...}' –

+0

@ LasseV.Karlsen条件文は、パラメータの数が増えると複雑になります。 – danrah

+0

[オブジェクトイニシャライザと動的にプロパティを指定する]の重複している可能性があります(http://stackoverflow.com/questions/2234091/object-initializer-and-dynamically-specifying-properties) – slawekwin

答えて

2

さて、あなたはnull合体演算子を使用して、それを簡素化することができます。

var foo = new Foo(); 
    foo.Bar = bar ?? foo.Bar; 

それとも、null値をチェックし、それらを無視するプロパティを変更することができます。

private string _bar = "foobar"; 
    public string Bar 
    { 
     get { return _bar; } 
     set { _bar = value ?? _bar; } 
    } 

その後、あなたはこのコードを使用することができます今もし

var foo = new Foo() { Bar = bar }; 

注:Fooをインスタンス化しますがnullの場合、その値はプロパティのセッターで無視されます。

1

最も簡単で読みやすい(私見)ソリューションは、次のようになります:

var foo = new Foo(); 
if (bar != null) 
    foo.Bar = bar; 

私は簡単にこれを行う方法の代わりに使用しているかどうかを知りたいですあなたがイニシャライザで示唆したような検証を行う方法はありません(少なくともC#6ではなく)。いくつかのコンストラクトを使用して、デフォルトの定数をここで他の答えと同様に抽出することもできますが、これは読みやすさを取り除き、クラスを使いやすくするものではありません。カプセル化。

あなたの主な関心事はコードスタイルに関する場合、間違っていることはなく、コードを管理している他の人や数ヶ月でわかりやすいため、ifに慣れてください。

プロパティ値の検証のように必要なものがある場合は、それをセッター自体に配置する必要があります。

+0

はい、正解ですが、条件文を避けるための機能があるかどうかを知りたかったのです – danrah

+0

@danrah(まだですか?)あなたが 'if'を作るために自動プロパティを変更することができないかぎり? – slawekwin

+1

@ダンナなぜですか?どのような問題を解決しようとしていますか? – Luaan

0

あなた行うことができます:それはクラスのトップにconstsですべてのデフォルト値を持つことの利点を持っていますが、私は本当に個人的にポイントが表示されていない

class Foo 
{ 
    public const string BarDefault = "foobar"; 
    public string Bar { get; set; } = BarDefault; 
} 

var foo = new Foo { Bar = bar ?? Foo.BarDefault }; 

。ただし、条件付きのステートメント(種類)は必要ありません。

0

あなたはstaticフィールドにBarプロパティのデフォルト値を抽出します場合:

new Foo 
{ 
    Bar = bar != null ? bar : Foo.defaultBarValue, 
}; 

しかし、私は、それは価値が疑問:

public class Foo 
{ 
    public string Bar { get; set; } = defaultBarValue; 

    public static string defaultBarValue = "foobar"; 
} 

あなたがこれを行うことができるでしょう努力...

+0

の値を検証するか、単に次のようにします。 'new Foo {Bar = bar ?? Foo.defaultBarValue、} ' –

+0

または単に' Bar = bar ?? "foobar"。 *呼び出し元*が値を検証しなければならない場合は、静的フィールド、定数またはハードコーディングされた文字列を使用するかどうかは関係ありません。検証ロジックはすでに@OrkhanAlikhanov、Trueを –

+0

でリークしました。しかし私は、OPが使ったのと同じ構造を使いたいと思っていました。 – haim770

1

ことをやってのクリーンなOOの道がオーバーロードコンストラクタとファクトリメソッドを使って、次のようになります。

class Foo 
    { 
     public Foo Create(string bar) 
     { 
      return bar == null ? new Foo() : new Foo(bar); 
     } 

     public Foo() : this("foobar") 
     { 
     } 

     public Foo(string bar) 
     { 
      Bar = bar; 
     } 
     public string Bar { get; } 
    } 
関連する問題