Microsoft MVP성태의 닷넷 이야기
yield return의 리턴 타입 질문 드립니다. [링크 복사], [링크+제목 복사],
조회: 18665
글쓴 사람
rysoo
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

안녕하세요 yield 키워드 공부 중에 이해가 잘 안 되는 부분이 있어 질문 드립니다.


yield return을 사용하는 함수의 리턴 타입이 IEnumerable일 때가 있고, IEnumerator일 때가 있던데 두가지 차이가 정확히 이해가 잘 안 됩니다. ㅠㅠ


단순히 foreach 구문의 in 뒤에 나오는 IEnumerable 객체를 클래스의 함수로 부르고 싶을 때, yield return이 사용되는 IEnumerbale 반환 함수를 만들면 되고,


클래스 자체에 IEnumerable을 상속 받아 GetEnumerator 함수를 구현하고자 할 때, IEnumerator를 반환하는 GetEnumerator 함수를 만들면 되는걸까요?


두가지 구현 방식의 차이점이 어떤 건지 궁금합니다.


[연관 글]






[최초 등록일: ]
[최종 수정일: 5/8/2019]


비밀번호

댓글 작성자
 



2019-05-08 12시54분
코드와 함께 질문해 주세요.
정성태
2019-05-08 03시10분
[rysoo] using System;
using System.Collections;
using System.Collections.Generic;

public class NameSet
{
    private List<string> names = new List<string>();

    public NameSet(params string[] values)
    {
        foreach (var e in values)
            this.names.Add(e);
    }

    public IEnumerable NameList()
    {
        int currentIndex = 0;

        while (currentIndex < names.Count)
        {
            yield return names[currentIndex];
            currentIndex++;
        }
    }
}

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var names = new NameSet("abc", "def", "ghi");

            foreach (var e in names.NameList())
                Console.WriteLine(e);
                
        }
    }
}


위 코드를 아래와 같이 바꿔도 동일한 결과가 나오는데 두 가지 차이가 궁금합니다.


public class NameSet : IEnumerable
{
    private List<string> names = new List<string>();

    public NameSet(params string[] values)
    {
        foreach (var e in values)
            this.names.Add(e);
    }

    public IEnumerator GetEnumerator()
    {
        int currentIndex = 0;

        while (currentIndex < names.Count)
        {
            yield return names[currentIndex];
            currentIndex++;
        }
    }
}

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var names = new NameSet("abc", "def", "ghi");

            foreach (var e in names)
                Console.WriteLine(e);
                
        }
    }
}

yield도 결국 간편 표기법이라고 하셨는데, 컴파일러가 위 두 코드를 동일하게 치환해서 처리를 하는 걸까요?
[guest]
2019-05-08 07시35분
다음의 글을 참조하시고,

C# - yield 문을 사용할 수 있는 메서드의 조건
; http://www.sysnet.pe.kr/2/0/11887

혹시 설명이 덜 되었다면 그 부분을 다시 질문해주세요. 그에 따라 부가 설명을 추가하겠습니다.
정성태
2019-05-08 11시45분
[rysoo] 많은 도움 되었습니다~~. 답변 감사합니다.
[guest]

... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5494지예예지5/13/202115824비동기 코드 흐름이 궁금합니다! [2]
5493xing...5/6/202113551xing api XQCSPAT00600 질문입니다 [4]파일 다운로드1
5492한예지 donator5/5/202113615FromCurrentSynchronizationContext 관련 코드 질문있습니다! [2]
5491조우성5/4/202119286WinForm과 WPF의 성능차이 비교한 자료가 있을까요? [4]
5490한예지 donator5/3/202115236UI 스레드의 Invoke 질문있습니다. [4]
5489저누4/28/202115559시작하세요 C# 9.0, 225페이지 구조체 관련 질문드립니다. [2]
5488종범4/27/202115575C# 비동기 함수 async, await 와 Task의 관계에 대해 질문 드립니다. [6]
5487진우4/27/202114646C# 엑셀 자동화 성능 향상 문의 [2]
5486지나가던...4/26/202115114닷넷 구현 코드 관련 질문 [2]
5485이재원4/17/202115487교재 315페이지 내용 질문 [3]
5484Syong4/16/202119419윈폼 기반의 응용프로그램 dll 참조와 32,64bit 빌드 관련 문의 [4]
5483한예지 donator4/15/202114325익명 형식과 var 관계 질문 있습니다. [2]
5482질문4/13/202116028WPF를 위한 MVVM toolkit 선택과 관련한 문의드립니다. [4]
5480한예지 donator4/5/202117338GetHashCode 질문있습니다! [2]
5479한예지 donator4/4/202115971Equals를 닷넷에서 어떻게 구현했는지 보고 싶을 떄는 어떻게 해야 될까요? [2]
5478갑자기C#3/23/202119141C# Winform에서 TextBox없이 입력 받을 수 있나요? [7]
5477달팽이3/18/202115103c# 도형을 그린후 편집하는 방법이 궁금합니다. [2]파일 다운로드1
5475dimo...3/2/202115626POH가 .NET 5에 추가된 것으로 알고 있습니다. POH가 유용한 경우는 어떤 경우가 있을까요? [1]
5474Syong2/26/202115448사용자 지정 컨트롤 생성시 Invalidate, Update, Refresh의 차이점 [2]
5473한예지 donator2/25/202114422디자인 타임이 뭔지 궁금합니다!! [5]
5472dimo...2/24/202116638등록하지 않고 ocx를 사용하는 `키움`관련 포스팅을 따라가다 질문드립니다. [9]
5471남산2/21/202114067MarshalDirectiveException 에 대한 질문입니다. [1]
5470한예지 donator2/7/202114100yield 질문있습니다!! [2]
5469유호성2/6/202113899Parallel + Task.Run 동시 실행 환경에서 간헐적으로 Task.Run()에서 null이 리턴됩니다. [3]파일 다운로드1
5467hero...2/4/202114512실행 환경에 따른 Thread.Sleep 딜레이 차이 질문 [8]
5466pr1/29/202114389c# winform load시 작업표시줄에 뜨지 않는 현상을 겪으신적이 있으신가요? [4]파일 다운로드1
... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...