#c#
#c#
Вопрос:
Если у меня есть, например, словарь:
private Dictionary<int, OrderSummary> _orderSummaries;
В C у меня может быть:
typedef int OrderID;
private Dictionary<OrderID, OrderSummary> _orderSummaries;
чтобы показать, что тип ключа словаря является идентификатором заказа. Есть ли эквивалент в C #?
Комментарии:
1. Вы могли бы назвать свой словарь ‘orderSummaryById’
2. вы имеете в виду typedefs? нет, не совсем.
3. @PaulG — да, именование может помочь, но иногда оно становится чрезмерно громоздким.
Ответ №1:
Вы могли бы использовать псевдоним типа, например:
using OrderId = System.Int32;
Но этот псевдоним будет действителен только в этом исходном файле.
Любой другой исходный файл будет видеть ваш словарь как Dictionary<int, OrderSummary>
.
Этот вид псевдонимов используется в основном для устранения неоднозначности между типами с одинаковым именем, а не в качестве замены typedef
. Использование его для любых целей, кроме различения типов с одинаковыми именами, является, IMO, плохой практикой и фактически препятствует удобочитаемости.
Если ваш OrderId
действительно имеет конкретное и четкое семантическое значение, я предлагаю создать свой собственный тип значения, который инкапсулирует int .
Комментарии:
1. -1 хотя это возможно, вы сбиваете с толку любого, кто просто случайно просматривает метод в вашем классе, чтобы посмотреть, что он делает. «о, у него есть класс с именем OrderID? что это? зачем идентификатору заказа нужен класс? о, наведение курсора мыши на него не показывает ничего интересного… давайте «перейдем к определению» … и т. Д. … »
2. @AK_ Я написал заявление об отказе от ответственности, в котором говорилось, что псевдонимы типов предназначены не для этого и что они не используются для удобства чтения. Я просто просто демонстрировал, насколько C # может приблизиться к typedef C . И я также сказал, что если он хочет создать псевдоним для
int
, потому что егоOrderId
псевдоним имеет особое значение, он должен создать свой собственный тип значения, который инкапсулирует int . Это неправильно?3. Мой голос уже заблокирован. Но я думаю, вам следовало подчеркнуть, что это не обычная или принятая практика.
Ответ №2:
Вы можете создать псевдоним типа: using OrderId = System.Int32;
Это допустимо только в этом исходном файле, поэтому он может документировать не так полно, как вам хотелось бы…
Однако, если вам нужно что-то, что документирует назначение вашей структуры данных (словаря) извне, тогда я бы реализовал класс-оболочку:
public class OrderSummaries
{
private readonly Dictionary<int, OrderSummary> _orderSummaries;
public OrderSummary FindOrderSummary(int orderId)
{
return _orderSummaries[orderId];
}
...
}
Вы также можете внедрить a struct
, который содержит один System.Int32
:
public struct OrderId
{
public readonly Int32 Id;
public OrderId(int id)
{
Id = id;
}
}
И использовать Dictionary<OrderId, OrderSummary>
Комментарии:
1. В первом примере, я думаю, вы имеете в виду
public OrderSummary
вместоpublic int
.