C#에서 매개변수화된 열거형을 표현하는 가장 좋은 방법은 무엇입니까?
해결책
OCaml이나 Haxe에 익숙하지도 않고, 다른 설명을 이해할 만큼 영리하지도 않아서, 나는 가서 찾아보았다. Haxe 열거형 문서 - 하단의 'Enum Type Parameter' 비트가 해당되는 부분인 것 같습니다.
이를 토대로 제가 이해한 바는 다음과 같습니다.
'일반' 열거형은 기본적으로 열거형 정의에서 정의한 항목으로 제한되는 값입니다.C# 예:
enum Color{ Red, Green, Yellow, Blue };
Color c = Color.Red;
c
둘 중 하나일 수 있다 Red
, Green
, Yellow
, 또는 Blue
, 그러나 다른 것은 없습니다.
Haxe에서는 열거형에 복합 유형을 추가할 수 있습니다. 해당 페이지의 고안된 예제는 다음과 같습니다.
enum Cell<T>{
empty;
cons( item : T, next : Cell<T> )
}
Cell<int> c = <I don't know>;
이게 뭐야? 나타납니다 이라는 뜻이다 c
리터럴 값으로 제한됩니다. empty
(구식 C# 열거형과 유사) 또는 복합 유형일 수도 있습니다. cons(item, next)
, 어디 item
는 T
그리고 next
는 Cell<T>
.
이것을 사용한 적이 없다면 아마도 익명 유형을 생성하는 것처럼 보일 것입니다(C# 컴파일러가 수행할 때 수행하는 방식과 같은). new { Name='Joe'}
.
열거형 값에 '접근'할 때마다 선언해야 합니다. item
그리고 next
그렇게 하면 임시 지역 변수에 바인딩되는 것처럼 보입니다.
Haxe 예 - 'next'가 익명 cons 구조에서 데이터를 가져오기 위해 임시 지역 변수로 사용되는 것을 볼 수 있습니다.
switch( c ) {
case empty : 0;
case cons(item,next): 1 + cell_length(next);
}
솔직히 말해서 이것이 무엇을 하고 있는지 '클릭'했을 때 내 마음을 사로잡았습니다.이는 믿을 수 없을 정도로 강력한 것으로 보이며 C#에서 유사한 기능을 찾는 이유를 알 수 있습니다.
C# 열거형은 원래 복사된 C/++ 열거형과 거의 동일합니다.기본적으로 좋은 말투네요 #define Red 1
따라서 컴파일러는 전달 시 문자열 대신 정수를 사용하여 비교 및 저장을 수행할 수 있습니다. Color
주변의 물건.
C#에서 이 작업을 수행하는 방법은 제네릭과 인터페이스를 사용하는 것입니다.이 같은:
public interface ICell<T> {
T Item{ get; set; }
ICell<T>{ get; set; }
}
class Cons<T> : ICell<T> {
public T Item{ get; set; } /* C#3 auto-backed property */
public Cell<T> Next{ get; set; }
}
class EmptyCell<T> : ICell<T>{
public T Item{ get{ return default(T); set{ /* do nothing */ }; }
public ICell<T> Next{ get{ return null }; set{ /* do nothing */; }
}
그러면 당신은 List<ICell<T>>
여기에는 항목과 다음 셀이 포함되며 삽입할 수 있습니다. EmptyCell
마지막에(또는 그냥 Next
참조가 명시적으로 null로 설정됨)장점은 다음과 같습니다. EmptyCell
멤버 변수가 없으므로 저장 공간이 필요하지 않습니다(예: empty
Haxe에서), 반면에 Cons
셀 것입니다.
컴파일러는 다음의 메소드를 인라인/최적화할 수도 있습니다. EmptyCell
아무 작업도 수행하지 않으므로 그냥 실행하는 것보다 속도가 향상될 수 있습니다. Cons
멤버 데이터가 null로 설정되어 있습니다.
나는 정말로 모른다.나는 내 솔루션이 특별히 자랑스럽지 않기 때문에 다른 가능한 솔루션을 환영합니다 :-)
다른 팁
사용 수업 열거형 값을 나타내는 정적 속성을 사용합니다.선택적으로 전용 생성자를 사용하여 클래스에 대한 모든 참조가 정적 속성을 통과하도록 강제할 수 있습니다.
다음을 살펴보세요. System.Drawing.Color
수업.이 접근 방식을 사용합니다.
C#(내가 아는 한 일반적으로 .NET 프레임워크)은 Java처럼 매개변수화된 열거형을 지원하지 않습니다.즉, 속성을 살펴보는 것이 좋습니다.Java 열거형이 할 수 있는 기능 중 일부는 속성을 통해 어느 정도 가능합니다.
이를 위해 클래스를 사용하는 것이 무엇이 문제인가요?추악하지만 언어 통합 Enum 지원이 있을 때까지 Java 사람들이 했던 방식입니다!