11. C \ # 교체 기 (6 장 6.1)

12541 단어 교체 기
오늘 우 리 는 C \ # 중의 교체 기 를 말 하고 먼저 교체 에 관 한 개념 을 이 끌 어 내 고 그 다음 에 코드 를 들 어 모두 가 토론 할 수 있 도록 한다.
교체 기 모델 은 행위 모델 의 범례 이 고 행위 모델 은 대상 간 의 통신 을 간소화 하 는 디자인 모델 이다.. NET 에서 IEnumerator 와 IEnumerable 인터페이스 와 그들의 일반적인 등가물 을 사용 하여 봉 인 된 것 입 니 다. 만약 에 하나의 유형 이 IEnumerable 인 터 페 이 스 를 실현 하면 교체 가능 하 다 는 것 을 설명 합 니 다. GetEnumerator 방법 을 사용 하여 IEnumerator 의 실현 을 되 돌려 줍 니 다. 이것 은 교체 기 자체 입 니 다.
C \ # 1 은 foreach 문 구 를 사용 하여 교체 기 에 접근 하 는 내 장 된 지원 을 실현 합 니 다. foreach 문 구 는 GetEnumerator 와 MoveNext 방법, Current 속성 으로 컴 파일 됩 니 다.C \ # 중간 교체 기 는 뒤로 만 접근 할 수 있 고 C + 중간 교체 기 는 앞 뒤로 접근 할 수 있 습 니 다.
배경, 학생 에 관 한 대열 이 있다 고 가정 하고 모든 학생 들 이 순서대로 자신의 이름 을 알려 줍 니 다. Student 류 는 다음 과 같 습 니 다.
 1 class Student
 2 {
 3     public string Name { get; set; }
 4 
 5     public Student(string name)
 6     {
 7         Name = name;
 8     }
 9 
10     public void SayName()
11     {
12         Console.WriteLine(Name);
13     }
14 }

IEnumerable 을 실현 하 는 Queue 의 범 형 류 가 있 습 니 다. 다음 과 같 습 니 다.
 1 class Queue<T> : IEnumerable<T> where T : class
 2 {
 3     public List<T> objects = new List<T>();
 4 
 5     public Queue(List<T> list)
 6     {
 7         objects = list;
 8     }
 9 
10     //   IEnumerable  GetEnumerator  
11     /*
12                           ,           QueueIterator<T>  ,         -1
13     */
14     public IEnumerator<T> GetEnumerator()
15     {
16         return new QueueIterator<T>(this);  
17     }
18 
19     IEnumerator IEnumerable.GetEnumerator()
20     {
21         throw new NotImplementedException();
22     }
23 }

GetEnumerator 방법 을 사용 하여 교체 기 를 되 돌려 줍 니 다. 교체 기 는 IEnumerator 인 터 페 이 스 를 실현 해 야 합 니 다. 다음 과 같 습 니 다.
 
 1 class QueueIterator<T> : IEnumerator<T> where T : class
 2 {
 3     private ConsoleDemo.Chapter6.Queue<T> q = null;
 4 
 5     int startPoint = -1;    //         
 6 
 7     public QueueIterator(ConsoleDemo.Chapter6.Queue<T> q)
 8     {
 9         this.q = q;
10     }
11 
12     //        T    ,              
13     public T Current
14     {
15         get
16         {
17             if (startPoint==-1 || startPoint==q.objects.Count)
18             {
19                 throw new InvalidOperationException();
20             }
21             int index = startPoint + q.objects.Count;
22             index = index % q.objects.Count;
23             return q.objects[index];
24         }
25     }
26 
27     object IEnumerator.Current
28     {
29         get
30         {
31             if (startPoint == -1 || startPoint == q.objects.Count)
32             {
33                 throw new InvalidOperationException();
34             }
35             int index = startPoint + q.objects.Count;
36             index = index % q.objects.Count;
37             return q.objects[index];
38         }
39     }
40 
41     public void Dispose()
42     {
43         
44     }
45 
46     public bool MoveNext()
47     {
48         if (startPoint != q.objects.Count)
49         {
50             startPoint++;
51         }
52         return startPoint < q.objects.Count;
53     }
54     //      ,       ,                 
55     public void Reset()
56     {
57         startPoint = -1;
58     }
59 }

IEnumerator 에서 current 속성, Dispose 방법 (필요 하 다 면), MoveNext 방법, Reset 방법 을 각각 실현 해 야 합 니 다.C \ # 2 의 yield 문 구 를 사용 하면 교체 기 를 간소화 하고 다음 편 에서 다시 이야기 할 수 있 습 니 다.
고 쳐 주세요.
 
 
 

좋은 웹페이지 즐겨찾기