2009-08-31 16 views
18

メソッドパラメータで基本タイプを使用する利点は何ですか?Resharperは、パラメータが 'BaseType'タイプであることを示唆しています

は、ここに1つのサンプルです:


private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable. 
{ 
    foreach (var i in numbers) { 
     Console.WriteLine(i); 
    } 
} 



そしてここで我々は実行時に失敗しますFooのが、種類や何かを変更することができますanother one


public class Foo : ICloneable 
{ 
    public object Clone() 
    { 
     return MemberwiseClone(); 
    } 

    public Foo CopyMe(Foo other) //R# laments: parameter can be ICloneable 
    { 
     return (Foo)other.Clone(); 
    } 
} 

を...です。



そこで質問:R#はパラメータはタイプ 'X'のものとすることができる提案したときに、私は何をすべきか?




PS。 Whysharper - a plugin that dovetails Resharper and StackOverflowのもう一つの説明。人々はそれがいいと言うが、良い説明が欠けている - うまくいけば一緒に我々はそれをより良くすることができる;)。パラメータのための基本型を使用して

+0

です:[戻り値の型としてのIEnumerable](http://stackoverflow.com/q/381208/161052) – JYelton

+0

私はクローンを()ICloneable契約であると仮定しています。私は、実行時に失敗しないように、CopyMeをより良く書くことができると仮定します。 – bubbleking

答えて

30

は、次のような利点があります。

  • はあなたのコード
  • 内の不要な結合が有効な入力
  • の広い範囲をすることによってあなたのコードはより安全にできるようにすることによって、あなたのコードはより柔軟になり削減します入力上で実行できる操作の種類を制限する
  • 種類間の変換を行う必要性を減らしてコードのパフォーマンスを向上させます

しかし、ReSharperのようなツールが可能であると言っているからといって、必ずしもメソッド呼び出しの基底型である必要はありません。メソッドの使用法とセマンティクスが明確であることを確認してください。また、将来の変更で継承階層を下げる必要がないため、既存のコードが破損する可能性があります。

上記の例では、Listの代わりにIEnumerableを使用することで、Listオブジェクトだけでなく、配列、スタック、キュー、さらにはLINQ呼び出し(主にIEnumerableを返す)の結果も渡すことができます。コードはコレクションを反復するだけなので、Listについて知る必要はありません。また、コードのコンシューマは、自分のコレクションを自分のメソッドに渡すためだけに、List型のコピーに変換する必要がないことを意味します。

8
+0

誰かがLiskovである理由を説明できますか? (私はそれが非常にうまくいくと信じていますが、私はいくつかの明確化が大好きです。) –

関連する問題