Visual C#을 사용하여 사용자 지정 컬렉션 구현

이 단계별 문서에서는 Visual C#에서 사용자 지정 컬렉션을 구현하는 방법을 보여줍니다. Microsoft .NET Framework 기본 클래스 라이브러리는 컬렉션 System.Collections.ICollection 인터페이스에 대한 공식적인 정의를 제공합니다.

원래 제품 버전: Visual C#
원래 KB 번호: 307484

사용자 지정 클래스에서 ICollection 인터페이스 구현

인터페이스는 ICollection 인터페이스에서 IEnumerable 상속됩니다. 인터페이스는 ICollection 메서드와 세 개의 CopyTo 읽기 전용 속성 IsSynchronized, 즉 , SyncRootCount를 정의합니다. ICollection 는 인터페이스에서 GetEnumerator 메서드를 상속합니다 IEnumerable . 사용자 지정 컬렉션 클래스는 인터페이스를 ICollection 구현해야 합니다.

인터페이스를 ICollection 구현하려면 다음 단계를 수행합니다.

  1. Visual C# .NET에서 Windows 애플리케이션을 만듭니다.

  2. 솔루션 탐색기 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 클래스 추가를 클릭하여 CustomCollection이라는 클래스 모듈을 추가합니다.

  3. 클래스 모듈의 시작 부분에 다음 샘플 코드를 추가하여 네임스페이 System.Collection 스를 가져옵니다.

    using System.Collections;
    
  4. 모듈의 다른 코드를 다음 샘플 코드로 바꿉 있습니다.

    public class CustomCollection : ICollection
    {
        private int[] intArr = {1,5,9};
        private int Ct;
    
        public CustomCollection()
        {
            Ct=3;
        }
    }
    

    간단히 하기 위해 클래스는 CustomCollection 세 개의 정수 항목과 개수 변수가 있는 배열을 보유합니다.

  5. CopyTo 정수 배열과 인덱스 를 매개 변수로 사용하는 메서드를 구현합니다. 이 메서드는 전달되는 인덱스에서 시작하여 컬렉션의 항목을 배열에 복사합니다. 이 메서드를 구현하려면 공용 CustomCollection 생성자 다음에 다음 코드를 붙여넣습니다.

    void ICollection.CopyTo(Array myArr, int index)
    {
        foreach (int i in intArr)
        {
            myArr.SetValue(i,index);
            index = index+1;
        }
    }
    
  6. 에서 GetEnumerator 인터페이스IEnumerable에 의해 상속되는 메서드를 ICollection 구현합니다. 메서드는 GetEnumerator 컬렉션을 반복할 수 있는 개체를 반환 Enumerator 합니다. 메서드 다음에 다음 샘플 코드를 붙여넣습니다 CopyTo .

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator(intArr);
    }
    
  7. 세 개의 읽기 전용 속성을 구현하려면 메서드 다음에 다음 코드를 붙여넣습니다 GetEnumerator .

    // The IsSynchronized Boolean property returns True if the
    // collection is designed to be thread safe; otherwise, it returns False.
    bool ICollection.IsSynchronized
    {
        get
        {
            return false;
        }
    }
    
    // The SyncRoot property returns an object, which is used for synchronizing
    // the collection. This returns the instance of the object or returns the
    // SyncRoot of other collections if the collection contains other collections.
    object ICollection.SyncRoot
    {
        get
        {
            return this;
        }
    }
    
    // The Count read-only property returns the number
    // of items in the collection.
    int ICollection.Count
    {
        get
        {
            return Ct;
        }
    }
    

GetEnumerator 메서드에 대한 열거자 개체 구현

이 섹션에서는 를 반복CustomCollection할 수 있는 클래스를 Enumerator 만드는 방법을 보여줍니다.

  1. 클래스 모듈의 end 클래스 문 다음에 다음 샘플 코드를 붙여넣습니다.

    public class Enumerator : IEnumerator
    {
        private int[] intArr;
        private int Cursor;
    }
    

    메서드를 intArr 호출할 때 클래스의 CustomCollection 요소를 저장할 프라이빗 정수 배열을 GetEnumerator 선언합니다. 필드 멤버는 Cursor 열거하는 동안 현재 위치를 보유합니다.

  2. 를 매개 변수로 사용하여 생성자를 intArr 추가하고 로컬 intArr 을 이 값으로 설정합니다. 멤버 필드 선언 다음에 다음 샘플 코드를 붙여넣습니다.

    public Enumerator(int[] intarr)
    {
        this.intArr = intarr;
        Cursor = -1;
    }
    
  3. MoveNext 메서드를 Reset 구현합니다. 이렇게 하려면 생성자 다음에 다음 코드를 붙여넣습니다.

    void IEnumerator.Reset()
    {
        Cursor = -1;
    }
    bool IEnumerator.MoveNext()
    {
        if (Cursor < intArr.Length)
            Cursor++;
    
        return(!(Cursor == intArr.Length));
    }
    

    ResetCursor-1 로 설정하고 MoveNextCursor 다음 요소로 이동합니다. MoveNext 성공하면 True 를 반환합니다.

  4. Current 가리키는 항목을 반환하는 읽기 전용 속성을 구현합니다 Cursor. 이 Cursor-1이면 를 생성합니다 InvalidOperationException. 메서드 다음에 다음 코드를 붙여넣습니다 MoveNext .

    object IEnumerator.Current
    {
        get
        {
            if((Cursor < 0) || (Cursor == intArr.Length))
                throw new InvalidOperationException();
            return intArr[Cursor];
        }
    }
    

각각에 를 사용하여 사용자 지정 컬렉션을 반복합니다.

  1. Form1.cs디자인 탭에서 단추를 폼으로 끕니다.

  2. 단추를 두 번 클릭하고 단추의 이벤트에 다음 샘플 코드를 Click 추가합니다.

    CustomCollection MyCol = new CustomCollection();
    
    foreach (object MyObj in MyCol)
        MessageBox.Show(MyObj.ToString());
    
  3. F5 키를 눌러 애플리케이션을 실행한 다음, 단추를 클릭합니다.

    참고

    메시지 상자에는 사용자 지정 컬렉션의 항목이 표시됩니다.

어떻게 작동하나요? 각 호출에 대 한 GetEnumerator 개체를 만드는 Enumerator 메서드를 호출 하 고 첫 번째 항목으로 설정 Cursor 하는 메서드를 호출 MoveNext 합니다. 그런 다음 현재 속성에 액세스하여 에서 MyObj항목을 가져옵니다. False를 반환할 때까지 MoveNext 반복됩니다.