>백엔드 개발 >C++ >C#에서 형식이 안전한 차별적 공용체를 어떻게 달성할 수 있나요?

C#에서 형식이 안전한 차별적 공용체를 어떻게 달성할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-02 14:20:43367검색

How Can We Achieve Type-Safe Discriminated Unions in C#?

C의 차별적 유니온

소개:

태그된 유니온 또는 분리된 유니온이라고도 알려진 차별적인 유니온은 단일 변수에 다양한 유형의 데이터를 저장할 수 있는 프로그래밍 구조입니다. 이는 제한된 수의 변형으로 값 집합을 표현하는 형식이 안전한 방법을 제공합니다.

문제 이해:

질문은 C#에서 Union 클래스를 제안합니다. C 스타일 공용체와 유사한 기능을 제공합니다. 그러나 클래스에는 Is 및 As 함수를 사용할 때 컴파일러가 적용하는 유형 검사가 부족합니다. 이 문제는 공용체에 실제로 해당 유형이 포함되어 있는지 확인하지 않고 특정 유형의 값을 검색하려고 할 때 발생합니다.

C#에서 유형 안전 공용체를 달성할 수 있습니까?

예, 일반 제약 조건과 패턴 일치를 사용하여 C#에서 형식이 안전한 구별 공용체를 구현할 수 있습니다. 예는 다음과 같습니다.

public abstract class Union<A, B, C>
{
    public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h);
}

public class Case1<A, B, C> : Union<A, B, C>
{
    public readonly A Item;
    public Case1(A item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => f(Item);
}

public class Case2<A, B, C> : Union<A, B, C>
{
    public readonly B Item;
    public Case2(B item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => g(Item);
}

public class Case3<A, B, C> : Union<A, B, C>
{
    public readonly C Item;
    public Case3(C item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => h(Item);
}

사용법:

이 Union 유형을 사용하려면 특정 사례의 인스턴스를 생성하세요.

var union1 = new Case1<int, string, bool>(5);
var union2 = new Case2<int, string, bool>('a');
var union3 = new Case3<int, string, bool>(true);

패턴 일치:

에서 값을 검색하려면 공용체, 패턴 일치 사용:

var value1 = union1.Match(n => n, _ => null, _ => null); // Returns 5 (int)
var value2 = union2.Match(_ => null, c => c.ToString(), _ => null); // Returns "a" (string)
var value3 = union3.Match(_ => null, _ => null, b => b.ToString()); // Returns "True" (string)

결론:

이 솔루션은 제네릭 및 패턴 일치를 활용하여 C#에서 형식이 안전한 구별 공용체를 제공합니다. 코드가 잘못된 값에 액세스하려고 시도하지 않도록 하여 애플리케이션의 안전성과 정확성을 향상시킵니다.

위 내용은 C#에서 형식이 안전한 차별적 공용체를 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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