2017-09-08 10 views
4

직장에서 일부 코드를 유지하고 있으며 원래 작성자가 없어서 내가 호기심을 만족시킬 수 있는지 여기에서 질문 할 것이라고 생각했습니다.이 경우 yield를 사용하면 어떤 이점이 있습니까?

아래는 수익률이 사용되는 약간의 코드 (익명 처리)입니다. 늘어나는만큼 내가 그것을 말할 수있는 어떤 이점을 추가하지 않고 그냥 목록을 반환 충분하고 어쩌면 (적어도 나를 위해 더) 읽을 수있을 것입니다. 이 패턴이 코드 기반의 몇 군데에서 반복되기 때문에 무언가를 놓치고 있는지 궁금합니다.

var productManager = new ProductManager(ValidProductTypes); 

public ProductManager(IEnumerable<string> validProductTypes) 
{ 
    var myFilteredList = GetFilteredTypes(validProductTypes); 
} 

public ObservableCollection<ValidType> GetFilteredTypes(IEnumerable<string> validProductTypes) 
{ 
    var filteredList = validProductTypes 
        .Where(type => TypeIsValid); //TypeIsValid returns a ValidType 
    return new ObservableCollection<ValidType>(filteredList); 
} 
+0

열거가 완료되지 않은 경우, 예를 들어 FirstOrDefault와 같이 이익이 발생하지 않을 수도 있지만 이후의 수익률에 대해 잠재적 인 비용이 많이 드는 실행이 모두 실행되지는 않습니다. 목록에 올랐어. 이 경우 Type2가 무거운 속성이지만 열거 형이이를 소비하지 않으면 목록보다 가벼워집니다. –

+3

IMHO, 그 시나리오는 간단한 배열로 더 잘 구현됩니다. 반복기 메소드 구문이 아무 것도 추가하지 않는다고 느낍니다. 그러나 그것은 주로 의견의 문제입니다. 여기서 해결할 실제적이고 실질적인 프로그래밍 _ 문제가없는 것 같습니다. –

답변

5

내가 yield return를 사용하면 간단 있다는 IEnumerable<T>를 반환하고 구현하는 것을 말할 것입니다 :

public virtual IEnumerable<string> ValidProductTypes 
{ 
    get 
    { 
    yield return ProductTypes.Type1; 
    yield return ProductTypes.Type2; 
    yield return ProductTypes.Type3; 
    } 
} 

이 속성은 컬렉션을 채우기 위해 그것을 사용하는 일부 클래스의 매개 변수로 사용됩니다 옵션

메쏘드가 IEnumerable<T>을 반환하는 것을 본다면 실제로 할 수있는 것은 하나뿐입니다 : 반복하십시오. 더 복잡한 작업 (LINQ 사용과 같은)은 반복되는 특정 방법으로 캡슐화됩니다.

메서드가 배열이나 목록을 반환하는 경우에도 메서드를 변형 할 수 있으므로 해당 API를 사용할 수 있는지 궁금해하기 시작할 수 있습니다. 예를 들어, ValidProductTypes.Add("a new product")을하면 어떻게됩니까?

구현에 대해 이야기하는 경우 차이가 훨씬 작아집니다. 그러나 호출자는 반환 된 배열 또는 목록을 IEnumerable<T>에서 구체 형식으로 캐스팅하고이를 변형 할 수 있습니다. 누구나 실제로 이것이 API의 의도 된 사용이라고 생각할 가능성은 작지만 yield return을 사용하면 가능하지 않기 때문에 기회는 0입니다.

문법이 대략적으로 복잡하고 이해가 쉽다고 생각하면, yield return은 합리적인 선택이라고 생각합니다. 위의 대답은이 성능이 중요한 코드가 아닙니다 가정되기 때문에 성능이 매우 작은 차이는 '원

public virtual IEnumerable<string> ValidProductTypes => 
    new[] { ProductTypes.Type1, ProductTypes.Type2, ProductTypes.Type3 }; 

: C# 6.0 표현의 몸체 속성, 배열에 대한 구문이 우세를 얻을 수 있지만 문제 없습니다. 이것이 성능에 중요한 코드라면 어떤 옵션이 더 좋은지 측정해야합니다. 그리고 할당을 없애는 것도 고려해 볼 수 있습니다 (아마도 필드에 배열을 캐싱하거나 그와 비슷한 것을 캐싱하여), 이것이 주요 요인 일 수 있습니다.

+0

간단히 보았을 때 열거 형 컬렉션을 사용하는 것보다 훨씬 복잡한 IL을 결과로 생성기로 효과적으로 전환시키는 '수익률 반환'사용이 기대됩니다. 나는 이것이 성능에 영향을 미친다고 생각할 것이다 (비판적은 아니지만 보통 배열과는 다를 수있다). – poke

+0

@poke 좋은 점, 성능에 대한 참고 사항을 추가했습니다. – svick