#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:
Посмотрите на это, он использует перегрузку оператора
Ответ №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. В таком случае, почему бы не опубликовать комментарий вместо бесполезного ответа?