IEnumberable 또는 Array 중 어떤 것을 선호해야 합니까?
제가 작업하는 많은 프로젝트에서 읽기 전용 컬렉션을 반환해야 할 때마다IEnumerable<T>인터페이스를 지정하고 다음과 같이 유형을 지정합니다.
Public ReadOnly Property GetValues() As IEnumerable(Of Integer)
Get
'code to return the values'
End Get
End Property
대부분의 경우 목록을 반환하지만 일부 기능과 읽기 전용 속성에서는 확장 메서드를 통해 목적에 맞는 배열을 반환합니다.
제 질문은 제가 특정 유형(예: , , 또는 s) 대신 반환함으로써 설계 원칙을 위반하고 있는가 하는 것입니다.
나는 일반적으로 선호합니다.IEnumerable<T>뿐만 아니라.중요한 것은 메소드에서 반환되는 실제(심지어 최소) 기능이 무엇인지 자문하는 것입니다(메소드 인수의 경우에는 메소드에 전달됨).
결과 집합에 대해 열거하기만 하면 되는 경우IEnumerable<T>정확히 그렇게 합니다.그 이상도 이하도 아닌.이를 통해 필요한 경우 메소드의 설치 공간을 파괴하지 않고 보다 구체적인 유형을 반환할 수 있습니다.
David의 대답은 그것을 거의 다룹니다.IEnumerable<T>일반적으로 모범 사례입니다.대부분의 최신 프레임워크 방법을 보면 이를 알 수 있습니다.
원래 질문에 읽기 전용 컬렉션을 지정했으므로 호출하여 이를 적용할 수 있습니다..ToList().AsReadOnly()당신의IEnumerable<T>인스턴스(instance)를 반환합니다.이것은 구체적인 예를 만들 것입니다.ReadOnlyCollection<T>당신이 돌아오도록.반품 유형은 여전히 다음과 같아야 합니다.IEnumerable<T>발신자는 당신이 특별히 반품한다는 것을 알 필요가 없기 때문입니다.ReadOnlyCollection<T>이런 식으로 발신자가 자신의 발에 총을 쏘는 것을 방지합니다.
(이 단계가 없으면, 발신자는 예를 들어 다음과 같은 캐스팅을 시도할 수 있습니다.IEnumerable<T>그것은 당신의 방법에서 나옵니다.List<T>캐스팅이 성공하면(원래 작업하던 것과 같은 경우), 발신자는 메소드 내에서 작업 중인 것과 동일한 목록을 수정할 수 있으며 예상치 못한 결과를 초래할 수 있습니다.)
는 반품을 고려하고 있습니다.IEnumerable<T>API는 구현이 게으른 평가를 사용할 수 있다는 강력한 힌트입니다.
게으른 평가가 사용될 수 있다는 것을 아는 것은 다음을 의미하기 때문에 호출자에게 중요할 수 있습니다.
결과에 대해 두 번 이상 반복(예: 카운트를 얻은 후 데이터에 액세스)하면 평가가 두 번 이상 수행됩니다.
결과를 반복하는 동안 API에서 예외를 발생시킬 수 있습니다.
예.
IEnumerable<MyObject> LazyEvaluatedApi()
{
}
...
IEnumerable<MyObject> result = LazyEvaluatedApi();
...
foreach(MyObject item in result) // Exception from LazyEvaluatedApi may be thrown here.
{
}
어떠한 에서도 게으른 API)를 것 , " Access Layer API"를 .ICollection<T>또는IList<T>호출자에게 액세스 권한을 부여하는 것 외에Count (재산ICollection<T>그리고.IList<T>및()가 있습니다.IList<T>에 한함), 또한 게으른 평가가 없을 것임을 분명히 나타내고 있습니다.
을 할 때ICollection<T>또는IList<T>당신의 구체적인 구현은 아마도 일반적으로 다음을 반환할 것입니다.List<T>전용인 에는 목이읽 록기전것중요경한돌다아다갑니로음으우이용인다돌▁if니▁then▁is아갑▁list▁returnonly,로를 반환합니다.List<T>.AsReadOnly()
그것은 당신이 무엇을 하고 싶은지와 당신이 "위반"하려는 의도에 달려 있습니다.이는 다음과 같습니다.
- 객체에 의해 반환된 컬렉션을 외부 코드로 변경하려면 수정 가능한 형식을 목록<>, 해시셋<> 스택<> 또는 수정을 허용하는 다른 형식으로 반환해야 합니다.
- 컬렉션 사용자가 컬렉션 자체를 수정하지 않고 컬렉션 항목을 반복하도록 하려면 이 방법을 사용하는 것이 좋습니다.
많은 우수한 설계 전문가와 원칙은 수정 가능한 수집 준비보다 IEnumberable <>를 반환하는 것을 선호한다는 점을 명심하십시오.
IEnumerable<T>수 해야 합니다.T가 참조 유형이면 호출자가 개체를 수정할 수 있습니다.
필요한 최소 수준의 기능을 제공하는 가장 일반적인 유형을 반환해야 합니다.이 경우, 당신의 발신자가 단지 데이터를 통해 상호작용을 해야 한다면, IEnumberable이 더 적절합니다.List<T>,HashSet<T>또는 다른 컬렉션 유형.이렇게 하면 발신자는 메소드 구현과 연결되지 않은 상태로 유지되며, 나중에 발신자를 방해하지 않고 메소드 구현을 자유롭게 변경할 수 있습니다.
에서 제공하는 추가 기능이 필요하지 않은 경우List<T>,HashSet<T>등 그 다음에 반환합니다.IEnumerable<T>괜찮아, 이모.
가장 적합하다고 생각되는 유형은 무엇이든 반환합니다. 컬렉션을 반복하거나 컬렉션과 LINQ-y 작업만 수행하면 됩니다.IEnumerable<T>대부분의 상황에서 좋습니다.
"더 풍부한" 유형을 반환해야 할 경우 구체적인 유형보다는 인터페이스를 반환하는 것을 고려합니다.IList<T>보다는List<T>,ISet<T>보다는HashSet<T>등 - 필요한 경우 호출 코드를 손상시키지 않고 향후 구현을 변경할 수 있습니다.
사정에 따라 다르겠지.메소드를 단순히 열거형으로만 사용하려면 IEnumberable을 선택하는 것이 좋습니다.
인덱스 조회와 같은 특정 기능이 중요한 경우 보다 구체적으로 설명할 수 있습니다.
즉, 언제든지 IEnumberable을 LINQ 식으로 래핑하여 원하는 대로 사용할 수 있습니다.반환된 유형이 이미 LINQ 식에 사용된 기능을 지원하는 경우 영리한 컴파일러가 해당 식을 최적화할 수 있습니다.
IEnumberable은 쿼리 로직을 결합할 수 있기 때문에 쿼리에 더 빠릅니다.컬렉션에 영향을 주는 동안 컬렉션을 변경하고 싶지 않기 때문에 일반적으로 값을 삭제하거나 변경하는 데 어레이를 사용합니다.
언급URL : https://stackoverflow.com/questions/5156561/should-i-favour-ienumerablet-or-arrays
'programing' 카테고리의 다른 글
| 동일한 기본 키를 참조하는 두 개의 외부 키 (0) | 2023.05.23 |
|---|---|
| 편집기에서 재생할 때 Xcode Simulator 애니메이션이 매우 느림 (0) | 2023.05.23 |
| lodash를 사용하여 개체를 어레이로 변환 (0) | 2023.05.23 |
| 연결 문자열에서 "서버"와 "데이터 원본" 비교 (0) | 2023.05.23 |
| Mongoose를 사용한 사용자 지정 오류 메시지 (0) | 2023.05.23 |