2010-07-15 3 views
14

그래서 C++에, 내가 할 수있는 사용 해요 :이 날 형식보다 그 자체로 문서를 만들 수 있습니다C#에서 내장 유형에 별칭을 지정하는 방법은 무엇입니까?

typedef int PeerId; 

하지만 추가도 나를 대해서는 peerID 언제든지 다른 유형을 표시 할 수 있습니다 모든 코드를 변경하지 않고 내가 원한다면 PeerId를 수업으로 만들 수도 있습니다. 이런 종류의 확장 성은 C#에서 원하는 것이지만, C#에서 'int'에 대한 별칭을 만드는 방법을 찾는 데 문제가 있습니다.

나는 using 문을 사용할 수 있다고 생각하지만 현재의 파일에 범위가 있기 때문에 작동하지 않습니다 (별칭을 여러 파일간에 다시 정의 할 필요가 없음). 또한 기본 제공 형식에서 클래스를 파생시킬 수 없습니다 (하지만 일반적으로 이것은 List 또는 Dictionary와 같은 ref-type의 별칭으로 사용됩니다). 내가 뭘 할 수 있는지 잘 모르겠다. 어떤 아이디어?

using DWORD = System.Int32; 
+0

왜 내장 된 유형에서 파생 될 수 없습니까? – arootbeer

+1

나는 단지 궁금한가요? 어떤 상황이나 이유가 누군가가 이것을 원할 것입니까? 죄송합니다. 이상하게 들리면 왜 int를 사용하지 않으려하는지에 대해 무지합니다. 다른 개발자가 코드를 읽는 것이 혼란스러운 것처럼 들립니다. –

+0

동의 해이 내용을 읽는 데 관심이 있지만 나쁜 습관이되어야합니다. –

답변

6

당신은 (AB)의 암시 적 변환 사용할 수 있습니다 :

+0

약간 복잡한 값 유형의 경우이 작업을 수행하기도하지만 이름을 사용하기 위해이 작업을 수행하지 않습니다. – ChaosPandion

16

는이 같은 전체 유형 이름 사용해야이 int로 동일한 공간을 차지

struct PeerId 
{ 
    private int peer; 

    public static implicit operator PeerId(int i) 
    { 
     return new PeerId {peer=i}; 
    } 

    public static implicit operator int(PeerId p) 
    { 
     return p.peer; 
    } 
} 

을, 당신은 할 수 해야 할 일 :

PeerId p = 3; 
int i = p; 

하지만 동의 할 필요는 없습니다.

+12

이 솔루션은 그의 질문 중이 부분을 처리하지 못합니다. 'using 문을 사용할 수 있다고 생각하지만 현재의 파일에 범위가 있기 때문에 작동하지 않습니다 (별칭은 여러 단어 사이에서 액세스 할 수 있어야합니다. 파일을 다시 정의하지 않고) ' –

11

요약

여기에 짧은 대답 :

  • 타입 정의가 실제로 컴파일 타임 코드 생성기에 의해 사용되는 변수입니다.
  • C#은 코드 생성 언어 구문을 추가하지 않도록 설계되었습니다.

따라서 typedef 개념은 C# 언어와 잘 어울리지 않습니다. 다음 컴파일 된 C 코드를 뱉어 사전 처리 컴파일러로 시작했다 ++ C :

긴 대답 C++에서

, 그것은 더 의미가 있습니다. 이 "코드 생성기"시작은 여전히 ​​최신 C++ 기능에 영향을 미칩니다 (즉, 템플릿은 본질적으로 컴파일 시간에 클래스와 함수를 생성하기위한 Turing-complete 언어입니다). 이 문맥에서 typedef는 컴파일 타임 타입 팩토리의 "결과"또는 타입을 "반환"하는 "알고리즘"을 얻는 방법이기 때문에 의미가 있습니다.

이 이상한 메타 언어 (부스트 외부에서 거의 마스터하지 않은)에서 typedef는 실제로 변수입니다.

설명하는 내용은 덜 복잡하지만 여전히 typedef를 변수로 사용하려고합니다. 이 경우 입력 변수로 사용됩니다. 그래서 다른 코드가 typedef를 사용할 때는 실제로 그 타입을 직접 사용하지 않습니다. 오히려 typedef 된 입력 변수를 기반으로 클래스와 메소드를 빌드하면서 컴파일 타임 코드 생성기 역할을합니다. C++ 템플릿을 무시하고 C typedef를 보면, 효과는 같습니다.C++은 다중 paradign 언어로 설계되었다

프로그래밍

C++ 및 제너 (OO 및 절차,하지만 부스트 때까지 작동하지 나왔다). 흥미롭게도, 템플릿은 예기치 않은 패러데인 인 생성 프로그래밍을 발전 시켰습니다. (Generative 프로그래밍은 C++ 이전에 있었지만 C++은 인기가있었습니다.) 생성 프로그램은 실제로 컴파일 될 때 실행 파일로 컴파일되는 필요한 클래스와 메소드를 생성하는 메타 프로그램입니다.

우리의 도구를 프로그래밍

C# 및 제너 천천히 같은 방향으로 진화하고있다. 물론 반사 방출은 "수동"생성 프로그래밍에 사용될 수 있지만 매우 고통 스럽습니다. LINQ 공급자가 표현식 트리를 사용하는 방식은 특성상 매우 생성 적입니다. T4 템플릿은 정말 가까이에 있지만 여전히 부족합니다. C# vNext의 일부가 될 "서비스로서의 컴파일러"는 일종의 변수 (typedef와 같은)와 결합 될 수 있다면 모든 것이 가장 유망한 것처럼 보입니다.

퍼즐의 한 조각은 still missing입니다. 생성 프로그램에는 자동 트리거 메커니즘이 필요합니다 (C++에서는 암시 적 템플릿 인스턴스화으로 처리 함).

아니요 C#의 모든 종류의 "코드 생성기"를 C#의 템플릿과 같이 사용하는 것은 C#의 모든 종류의 코드 생성기 (C++ 템플릿을 이해할 수있는 C++ 프로그래머가 거의 없음)입니다. 이것은 아마도 C#보다는 T4가 만족하는 틈새 일 것입니다.

결론 (요약 반복) 위의

모든이 말을하는 것이다

  • 타입 정의 코드 발생기에 의해 사용되는 변수이다.
  • C#은 코드 생성 언어 구문을 추가하지 않도록 설계되었습니다.

따라서 typedef 개념은 C# 언어와 잘 어울리지 않습니다.

+3

매우 유익한 답변이지만, 아직 알지 못했던 어떠한 정보도 수반하지 않으며 실제로 내 초기 질문에 대답하지도 않습니다. 나는 단순히 모든 사람에게 내가 생각하고 기대하는 것을 보여주기 위해 typedef를 언급하고있었습니다. 별칭은 컴파일 시간이 반드시 필요할 필요는 없으며 파생과 같은 다양한 형식을 취할 수 있습니다. "public class PeerId : int {}", 이렇게하면 충분하고 내 문제를 완벽하게 해결할 수 있습니다. –

+0

또한 흥미롭고 유용한 정보에 대한 답을 +1하십시오. –

1

이름을 변경하기 위해 기본적인 유형을 재정의하는 것은 C++의 생각이며보다 순수한 객체 지향 C#과 잘 어울리지 않습니다. 한 언어에서 다른 언어로 개념을 구속하려는 충동을 얻을 때마다 그 언어가 의미가 있는지 없는지 생각하고 플랫폼에 고유하게 머물러야합니다.

고유 한 값 유형을 정의하여 기본 유형을 쉽게 변경할 수 있어야한다는 요구 사항을 충족시킬 수 있습니다. 암시 적 변환 연산자 및 산술 연산자와 함께 매우 강력한 유형을 정의 할 수 있습니다. 단순한 유형 위에 레이어를 추가 할 때 성능이 걱정된다면 그렇게하지 마십시오. 99 %의 확률로 그렇지 않을 가능성이 있으며 1 %의 가능성은 성능 최적화의 "낮은 매달린 열매"가되지 않을 것이라는 점입니다.

3

가끔은 OP와 비슷한 목적으로 (정수) typedef가 필요하다고 생각합니다.당신이 캐스트가 명시되는 괜찮다면

이 작업을 수행 할 수 있습니다 (나는 실제로이 원하는) :

enum PeerId : int {};

도 (분명히) byte, sbyte, short, ushort, uint, long, 또는 ulong을 위해 작동합니다.

정확히 의도 된 용도는 enum이 아니지만 작동합니다.

관련 문제