эмуляция typedef в C#

#c#

#c#

Вопрос:

У меня есть переменная поля с именем uid в классе. Тип — int, но я хочу открыть возможность того, что я изменю его long или short.

В C для этой цели используется typedef, но я вижу, что в C # нет typedef.

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

Ответ №1:

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

Например:

 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);
        }
    }
}
  

Комментарии:

1. 1. Я знал, что C # использует псевдонимы для многих более примитивных классов (таких как string и int), но я не знал, что вы можете создать свой собственный! Отличная штука.

2. Обычно я использовал это как метод для обхода конфликтов имен. Например, в пространстве имен модульного теста MSTest есть атрибут DescriptionAttribute, а в различных пространствах имен GUI — один. Если вы хотите использовать пространство имен GUI для некоторой поддержки, которую оно предоставляет в ваших модульных тестах, немного using TestDescription = Microsoft.UnitTesting.Whatever.Blah; может быть удобно.

3. (Хотя я действительно думаю, что исходный вопрос было бы лучше решить с помощью class или struct , чем псевдонима типа.)

4. ИМХО, это не имитирует C typedef , потому что директиву using необходимо было бы добавлять к каждому исходному файлу, который ссылается на нее. В C это было бы определено во включаемом файле, но C # не поддерживает includes.

Ответ №2:

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

Вы могли бы даже сделать это идентификатором guid!

Ответ №3:

Сделайте это структурой:

 struct Uid { public int Value; }
  

Ответ №4:

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

 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)
         {
             ...
         }
     }
}
}
  

Ответ №5:

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

   public struct ID_Type
  {
      public long Id;
  };
  

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

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

Ответ №6:

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

 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; } 

}
  

Комментарии:

1. На самом деле я бы не рекомендовал здесь дженерики. Если будет решено использовать другое время, его придется менять везде, где оно используется, а не только в структуре / классе «typedef». В этом случае можно просто использовать исходный тип и избежать переноса.

2. Я в замешательстве — суть дженериков в том, что тип является параметром; вам нужно будет изменить его только один раз. Чего мне здесь не хватает?

Ответ №7:

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

Комментарии:

1. Конечно, я думаю, если бы вы хотели найти все места, где она использовалась, и изменить объявление этих переменных тоже.

2. Если существует несколько экземпляров, это должен быть не typedef, а класс.

Ответ №8:

Посмотрите на это, он использует перегрузку оператора

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/019a258e-8d50-4a9f-b0ef-8311208ebb6a/

Ответ №9:

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

     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
  

Ответ №10:

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

НЕТ

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

В чем проблема?

Комментарии:

1. -1. Ваш комментарий должен был быть забавным, но здесь определенно есть проблема, и сообщение миру, что вы этого не хотите видеть, никоим образом не помогает OP.

2. На самом деле это не должно было быть забавным, скорее, чтобы заставить оператора больше задуматься о том, почему он думает, что ему нужно было бы изменить тип своего UID на long или short на современном языке, таком как C #.

3. В таком случае, почему бы не опубликовать комментарий вместо бесполезного ответа?