>백엔드 개발 >C++ >.NET 컬렉션에서 인덱싱된 액세스를 사용하여 공변 동작을 어떻게 달성할 수 있습니까?

.NET 컬렉션에서 인덱싱된 액세스를 사용하여 공변 동작을 어떻게 달성할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-30 10:43:10373검색

How Can I Achieve Covariant Behavior with Indexed Access in .NET Collections?

공분산 및 IList 제한 이해

공분산은 참조 유형을 기본 또는 인터페이스의 변수에 할당할 수 있는 프로그래밍 원칙입니다. 유형. 그러나 이는 컬렉션, 특히 IList 인터페이스를 고려할 때 딜레마를 야기합니다.

IList는 인덱스 액세스가 있는 컬렉션을 나타내므로 인덱스로 요소를 검색할 수 있습니다. 불행하게도 List 완전한 공변성을 방지하는 get 및 set 인덱서를 모두 구현합니다.

인덱스 액세스가 포함된 공변 컬렉션을 위한 솔루션

이러한 제한에도 불구하고 다음을 달성할 수 있는 방법이 있습니다. 색인화된 액세스를 유지하면서 공변적 동작

1. ReadOnlyCollections(.NET 4.5 이상)

IReadOnlyList 및 IReadOnlyCollection .NET 4.5에 도입된 공변 인터페이스입니다. 여기에는 get 인덱서만 있으므로 공변 시나리오에 적합합니다. 목록 및 ReadOnlyCollection 두 인터페이스를 모두 구현합니다.

2. 사용자 지정 래퍼

이전 버전의 .NET에서 인덱싱된 액세스가 포함된 공변 컬렉션이 필요한 경우 래퍼 클래스를 만들 수 있습니다. 래퍼 클래스는 IList get 인덱서와 IEnumerable 인터페이스.

다음 코드는 CovariantList라는 사용자 정의 래퍼 클래스를 보여줍니다. IList에 대한 공변적 액세스를 제공합니다:

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }

    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        private readonly IList<T> tail;

        public CovariantList(IList<T> tail)
        {
            this.tail = tail;
        }

        public T this[int index] { get { return tail[index]; } }
        public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();}
        IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); }
        public int Count { get { return tail.Count; } }
    }
}

public interface IIndexedEnumerable<out T> : IEnumerable<T>
{
    T this[int index] { get; }
    int Count { get; }
}

위 내용은 .NET 컬렉션에서 인덱싱된 액세스를 사용하여 공변 동작을 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.