場合によります。
この質問が数回尋ねられたのを見てきましたが、「場合による」という答えを説明するための良い例を次に示します。
次のクラスを検討してください。
public class MyClass
{
public static IEnumerable<int> Test()
{
return new List<int> { 2, 3, 4 };
}
public static List<int> Test2()
{
return new List<int> { 2, 3, 4 };
}
}
Test
IEnumerable
を返し、インターフェイスTest2
の具体的な実装を返します (この場合)。最良の方法は何ですか?または?IEnumerable
List
Test
Test2
実際には、どちらも意味的に異なります。
Test
のみを返すため、開発者が列挙型( )で返されたオブジェクトを使用するのは、メソッド コントラクトの一部であるIEnumerable
ことを意味します。foreach
Test2
インスタンスを返すとList
、ユーザーはList
by インデックスのオブジェクトにアクセスできます。これは、返されたオブジェクトのまったく異なる使用法です。
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
開発者が列挙型でのみ返されたオブジェクトを使用することを期待している場合は、インターフェイスを戻り値の型として使用できます。開発者がインターフェイスの具体的な実装のメソッド/プロパティを使用することを期待している場合 (上記の例では、インデックスによるオブジェクトへのアクセス)、具体的な型を返すことができます。
また、選択の余地がない場合もあることを忘れないでください。たとえば、Silverlight バインディングに使用するパブリック コレクションを公開する場合はObservableCollection<T>
、 ではなくを返す必要があります。これは、バインディング システムがクラスIEnumerable<T>
のメソッド/プロパティ/動作を実際に必要とするためです (バインディングには不十分です)。働きます)。ObservableCollection
IEnumerable
避けるべきは、毎回IEnumerable<T>
使用される戻り値のメソッドです。ToList()