2010-05-06 6 views
3

많은 양의 소스 파일에서 유효해야하는 일부 유형을 정의하기 위해 typedef aquivalent를 사용하려는 C 래퍼를 작성하고 있습니다. 이러한 "유형"은 [u] int16/32/64_t와는 다른 별명이지만 함수 매개 변수를 구별하는 데 유용합니다.여러 소스 파일에 걸쳐 C#의 typedef

하나는 using MyId=System.Int32;을 사용할 수 있지만이 파일은 모든 파일에서 다시 표시해야합니다 ... 더 좋은 방법이 있습니까?

+0

Int16, Int32, Int64 또는 short, int, long을 직접 사용할 수 없습니까? –

+0

C에서 typedef를 사용하는 것이 실제로 실용적인가요? 코드를 읽기 어렵게 만드나요? –

+0

이것은 이론적으로는 가능하지만 이러한 형식 이름은 함수 선언에 정보를 전달합니다. – Danvil

답변

4

대체 방법 중 하나는 기본 유형에 암시 적으로 변환 된 구조체를 사용하는 것입니다.

public struct MyHandle 
{ 
    private int _handle; 

    internal MyHandle(int handle) 
    { 
     _handle = handle; 
    } 

    public static implicit operator int(MyHandle handle) 
    { 
     return handle._handle; 
    } 
} 

귀하의 내부 코드는 여전히 암시 적 변환을 통해 (이 경우 int)를 기본 형태로 사용할 수 있습니다,하지만 당신은 사용자에게 강한 타입으로 노출됩니다. 사용자는 사실상 의미가 없지만 int 값을 볼 수도 있습니다. 생성자가 어셈블리의 내부에 있고 다른 방향으로 변환 연산자를 제공하지 않으므로 int를 Handle 형식으로 직접 캐스팅 할 수 없습니다.

+0

C#의 일부로 잘 보이지 않기 때문에 투표를 해 줬습니다. 또한 영리한 솔루션입니다. 하지만 실제 코드에서이 솔루션을 실제로 받아들이고 사용하는 것은 힘들 것입니다. –

+1

저는 서로 다른 좌표계로 작동해야하는 수학적 코드 (특정 응용 프로그램에 대한 구체적인)에 대해 비슷한 접근법을 사용했습니다. 기본 데이터 구조가 모든 경우에 본질적으로 3d 벡터 였음에도 불구하고 함수 정의에서 사용 된 좌표계를 볼 수있는 것은 매우 유용했습니다. 관련된 좌표계에 따라 정확한 기본 기능 변경이 사용되는 깨끗한 오버로드 솔루션을 허용했습니다. –

+0

나는 MS JIT가 근본적인 "int"그 자체를 다루는 것처럼 거의 같은 구조체를 다루는 코드를 낼 수 있다고 읽었다. 핸들에 레지스터를 저장할 수 있습니다. – Qwertie

0

내가 UInt32와 사용자 지정 유형의 합법적 인 사용을 구별하려고한다고 가정하고 있으므로 네가 수동으로 사용하려는 별칭을 수동으로 참조해야합니다.

관련 문제