소개:
태그된 유니온 또는 분리된 유니온이라고도 알려진 차별적인 유니온은 단일 변수에 다양한 유형의 데이터를 저장할 수 있는 프로그래밍 구조입니다. 이는 제한된 수의 변형으로 값 집합을 표현하는 형식이 안전한 방법을 제공합니다.
문제 이해:
질문은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!