Есть ли способ написать самодокументируемые типы на C #?

#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 .