2010-12-15 4 views
4

У меня есть переменная поля uid в классе. Тип int, но я хочу открыть возможность того, что я меняю его длинным или коротким.typedef emulation in C#

С C++ тип typedef для этой цели, но я вижу, что C# не имеет typedef.

Есть ли способ имитировать typedef в C#?

ответ

9

Я думаю, вы пытаетесь создать псевдоним типа. Если это так, вы можете использовать его через using alias directive. При назначении псевдонима необходимо указать полный тип (полное пространство имен).

Например:

using System; 
using MyAlias = System.Int32; 

namespace UsingAlias 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyAlias temp = Math.Min(10, 5); 
      Console.WriteLine(temp); 

      MyAlias result = MyAlias.Parse("42"); 
      Console.WriteLine(result); 
     } 
    } 
} 
-2

Есть ли способ, чтобы имитировать ЬурейеЕ в C#

Нет

решить мою проблему

Какая проблема?

+0

+1: Я не вижу проблем ... – 2010-12-15 20:50:55

+1

-1. Ваш комментарий должен был быть забавным, но здесь определенно проблема, и рассказывать миру, что вы этого не хотите (хотите) видеть, это никак не помогает OP. – 2010-12-15 20:57:38

+0

На самом деле это не предназначалось для смешного, больше для того, чтобы заставить OP больше думать о том, почему он думает, что ему нужно будет изменить тип своего UID на длинный или короткий на современном языке, таком как C#. – Joe 2010-12-16 06:44:59

8

Попробуйте сделать class. Это похоже на typedef на стероиды, и вы можете изменить внутреннее представление столько, сколько хотите, не затрагивая интерфейс!

Вы даже можете сделать это направляющей!

0

Не будет ли результат таким же, если вы использовали int, а затем изменили его позже?

3

Сделать стартовой:-структуру

struct Uid { public int Value; } 
1

определения структуры только с одним полем

public struct ID_Type 
    { 
     public long Id; 
    }; 

и использовать его везде, где вам это нужно.

Если у вас есть только один класс, где требуется тип идентификатора, вы также можете попытаться сделать этот класс универсальным классом с типом UID, являющимся параметром типа.

2

Инкапсулируйте его в его собственном классе (или структуры, если более уместно).

public class UID 
{ 
    public int Value { get; set; } 
} 

Напишите свои методы с точки зрения вашего класса UID, ограничивая воздействие фактического типа значения к наименьшему подмножества кода необходимого.

publc class Entity 
{ 
    public UID ID { get; set; } 

    public void Foo(UID otherID) 
    { 
     if (otherID.Value == this.ID.Value) 
     { 
      ... 
     } 
    } 
} 
} 
1

Вы всегда можете использовать дженерики:

public class Foo<T> 
{ 
    public T MyField { get; set; } 
} 

public class FooInt : Foo<int> 
{ 
} 

public class FooShort : Foo<short> 
{ 
} 

или просто изменить его позже.

/// want an int 
public class Foo 
{ 
    public int MyField { get; set; } 
} 

/// and just change it later on: 
public class Foo 
{ 
    public short MyField { get; set; } 

} 
0

Вот простое решение, которое помогло.

using typedef = System.Int32; 

    class MyTypeDef 
    { 
      typedef ERROR, TRUE=1, FALSE=0; 
      public int MyMethod() 
      { 
       if(this is an error condition) 
       { 
       ERROR = TRUE; 
       } 
       else 
       { 
        ERROR = FALSE; 
       } 
       return ERROR; 
      } // end MyMethod 
     } // end MyTypeDef