2013-03-27 6 views
7

コンストラクタが常に私がここにあるものより少なくとも1つの値で呼び出されることを保証するより洗練された方法がありますか?値を指定しないとコンパイラエラーが発生するので、私はこのようにしました。最低1つの値が必要なC#のパラメータ

public class MyClass 
{ 
    private readonly List<string> _things = new List<string>(); 
    public string[] Things { get { return _things.ToArray(); } } 

    public MyClass(string thing, params string[] things) 
    { 
     _things.Add(thing); 
     _things.AddRange(things); 
    } 
} 

EDIT

コメントに基づいて、私は...これまでの試みで、前にコードを編集するための

public class Hypermedia : Attribute 
{ 
    private readonly Rel[] _relations; 
    public IEnumerable<Rel> Relations { get { return _relations; } } 

    public Hypermedia(Rel relation, params Rel[] relations) 
    { 
     var list = new List<Rel> {relation}; 
     list.AddRange(relations); 
     _relations = list.ToArray(); 
    } 
} 

謝罪をコードを変更しました私がやろうとしていたことを隠す。私のコードエディタからそのまま貼り付けるほうが簡単です!

+0

実装の詳細として行うための唯一の他の_tiny_ビットは、可能なサイズ変更を回避するために全長にコンストラクタで '_thingsリスト'をインスタンス化することである: '_things =新しいリスト(things.Length + 1);'しかしそれはほんのわずかな最適化です(差はないようです)。署名の変更に関しては、そうは思わない。 (ただし、このシグネチャは、実行時に配列を生成し、コンパイル時に 'params'を使用せずに渡したい場合には苦労します;最初の配列要素を切り離して全体を構築する必要があります残りのパラメータの2番目の配列) –

+3

呼び出し側は 'thing'として' null'を渡すことができます –

+0

@Tim - 私はパラメータを持っていれば、私は強制的に "事"パラメータを追加していますパラメータが指定されていない場合はコンパイラエラーです。 –

答えて

13

Code Contracts

public MyClass(params string[] things) 
{ 
    Contract.Requires(things != null && things.Any()); 
    _things.AddRange(things); 
} 

コード契約はあなたのコード、コンパイル時の解析ため静的アナライザ、およびランタイム・アナライザをマーキングするためのクラスが含まれています。

少なくとも、静的アナライザーからの警告が表示されます。また、リリース・モードで実行時分析をオフにして、パフォーマンスが低下するのを防ぐことができます。

+1

+1のコード契約.. –

+0

知っておくと便利ですが、私が何をしたのかは分かりません。 –

関連する問題