C#에서 매개변수화된 열거형을 표현하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/66819

  •  09-06-2019
  •  | 
  •  

문제

매개변수화된 열거형을 나타내는 좋은 솔루션이 있습니까? C# 3.0?나는 다음과 같은 것을 찾고 있습니다 OCaml 또는 학세 가지다.지금은 쉽게 전환할 수 있는 간단한 열거형 필드가 있는 클래스 계층 구조만 생각할 수 있습니다. 더 나은 아이디어가 있을까요?

답변 중 하나에서 아래 Ocaml 예제를 참조하세요. Haxe 코드는 다음과 같습니다.

enum Tree {
   Node(left: Tree, right: Tree);
   Leaf(val: Int);
}
도움이 되었습니까?

해결책

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), 어디 itemT 그리고 nextCell<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 사람들이 했던 방식입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top