2008-10-07 7 views
1

메소드의 반환 값/입력 값에서 컬렉션 사용에 대해 친구와 약간의 토론을 가졌습니다. 그는 - 반환 값에 대해 가장 많이 파생 된 유형을 사용해야한다고했습니다. - 입력 매개 변수에 대한 최소 파생 유형입니다.매개 변수/반환 값 (컬렉션)에 대한 코드 규칙은 무엇입니까

그래서 예를 들어 메서드는 ReadOnlyCollection을 매개 변수로 가져와 List를 반환해야합니다.

또한 그는 우리가 공개 API에서 List 또는 Dictionary를 사용해서는 안되며 Collection, ReadOnlyCollection 등을 대신 사용해야한다고했습니다. 따라서 메소드가 public 인 경우 해당 매개 변수와 반환 값은 Collection, ReadOnlyCollection, ...이어야합니다.

맞습니까?

답변

8

입력 매개 변수와 관련하여 가장 구체적인 유형을 사용하는 것이 일반적으로 유연합니다. 예를 들어, 모든 메서드가 수행하려고하는 경우 인수로 전달 된 컬렉션의 항목을 열거하면 IEnumerable <T>을 받아들이는 것이 더 융통성이 있습니다.

예를 들어, 고객의 모음입니다 매개 변수 받아들이는 방법 "ProcessCustomers"고려 : 당신이 IEnumerable을 < 고객 >로 매개 변수를 선언하면

public void ProcessCustomers(IEnumerable<Customer> customers) 
{ 
    ... implementation ... 
} 

를, 발신자 쉽게 하위 집합에 전달할 수 있습니다 모음으로, 같은 코드를 사용하여 다음 (사전-NET 3.5 : 당신은 람다 식을 사용할 수 있습니다 .NET 3.5) : 일반적으로 MS의 가이드 라인에

private IEnumerable<Customer> GetCustomersByCountryCode(IEnumerable<Customer> customers, int countryCode) 
{ 
    foreach(Customer c in customers) 
    { 
     if (c.CountryCode == countryCode) yield return c; 
    } 
} 

... 
ProcessCustomers(GetCustomersByCountryCode(myCustomers, myCountryCode); 
... 

목록 <에게 T 01을 노출하지 않는 것이 좋습니다를. 이유에 대한 설명은 코드 분석 (FxCop) 팀의 this blog entry을 참조하십시오.

0

정말 API를 타겟팅하는 개발자를 제한하기 때문에 API의 매개 변수로 List 또는 Dictionary를 반환하거나 사용하지 않는 것에 동의하는 경향이 있습니다. 대신에 IEnumerable <>을 반환하거나 전달하는 것이 효과적입니다.

거친 것 중에서이 모든 것은 응용 프로그램에 따라 다릅니다. 그냥 내 의견.

관련 문제