다릅니다.
나는이 질문을 두 번이나 보았으며 여기에는 "의존적 인"답을 설명하는 좋은 예가 나와 있습니다.
은 다음 클래스를 고려
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
).
- 은
List
인스턴스를 반환하므로 인덱스를 사용하여 List
의 개체에 액세스 할 수 있습니다. 그것은 반환 된 객체의 완전히 다른 활용입니다.
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
당신이 개발자는, 당신은 반환 형식으로 인터페이스를 사용할 수있는 열거에 반환 된 객체를 사용할 것으로 예상되는 경우
. 개발자가 인터페이스의 구체적인 구현 (위의 예제에서 인덱스로 객체에 액세스)의 메서드/속성을 사용하기를 기대하는 경우 구체적인 유형을 반환 할 수 있습니다.
가끔 선택의 여지가 없음을 기억하십시오. 예를 들어 Silverlight 바인딩에 사용해야하는 공용 컬렉션을 노출하려면 바인딩 시스템에 ObservableCollection
클래스의 메서드/속성/동작이 실제로 필요하므로 IEnumerable<T>
이 아니라 ObservableCollection<T>
을 반환해야합니다 (IEnumerable
은 그렇지 않습니다. 바인딩이 작동하기에 충분한).
피해야 할 사항은 IEnumerable<T>
을 반환하며 매번 ToList()
과 함께 사용되는 메서드입니다.
IEnumerable을 반환하는 메서드가 싫다면 List 입니다. 일반 for 루프 (인덱스와 함께 참조 항목)를 사용할 수 없거나 LINQ Count 메서드를 사용하지 않고 가장 간단한 Count 메서드를 호출 할 수도 없습니다. 내가하는 모든 것이 목록을 반환 할 때 사용하는 반환 형식은 IList 입니다. yield return과 함께 사용하면 IEnumerable 만 반환합니다. 한 편 : 공용 라이브러리를 개발할 때 IEnumerable을 사용하면 더 많은 이점을 얻을 수 있습니다. –
Nullius