Подтвердить что ты не робот

С# - StyleCop - SA1121: UseBuiltInTypeAlias ​​- Правила чтения

Не найден в справочном руководстве StyleCop, на SO и Google, так что вот оно:)

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

SA1121 - UseBuiltInTypeAlias ​​- Правила читаемости

В коде используется один из базовых С# типов, но не использует встроенный псевдоним для типа.

Вместо использования имени типа или полное имя типа, встроенные псевдонимы для этих типов всегда следует использовать: bool, byte, char, десятичный, двойной, короткий, int, long, object, sbyte, float, string, ushort, uint, ulong.

поэтому String.Empty неверно (зависит от правил выше) и String.Empty является хорошим.

Почему лучше использовать встроенные псевдонимы? Может ли String. Int32, Int64 (и т.д.) Усложнять код в специальных сценариях?

4b9b3361

Ответ 1

Просто чтобы уточнить: не все согласны с авторами StyleCop. Win32 и .NET гуру Джеффри Рихтер пишет в своей отличной книге CLR через С#:

Спецификация языка С# гласит: "В зависимости от стиля использование ключевого слова предпочтительнее использование полного имени типа системы." Я не согласен с языком спецификации, я предпочитаю использовать имена типов FCL и полностью исключить имена примитивных типов. На самом деле я желаю компиляторы даже не предлагали примитивные имена типов и вынуждали разработчиков использовать FCL вместо имен типов. Вот мои причины:

  • Я видел, как некоторые разработчики путались, не зная, следует ли использовать строкуили Строка в коде. Потому что в С# строка (ключевое слово) отображает System.String (тип FCL), нет никакой разницы и может быть использована. По аналогии, Ive слышал, как некоторые разработчики говорят, что int представляет 32-битное целое число, когда приложение работает на 32-разрядной ОС и что он представляет собой 64-разрядное целое число, когда приложение работает на 64-битной ОС. Это утверждение абсолютно неверно: в С# всегда int отображает до System.Int32, и поэтому он представляет собой 32-разрядное целое, независимо от ОС, код работает. Если бы программисты использовали в своем коде Int32, то этот потенциал путаница также устранена.

  • В С#, long отображаются карты System.Int64, но на другом языке программирования длинныйможет сопоставляться с Int16 или Int32. На самом деле, С++/CLI обрабатывает long как Int32. Кто-то, читающий исходный код на одном языке, может легко неверно интерпретировать коды если он или она были использованы для программирования на другом языке программирования. На самом деле, большинство языков даже не обрабатывают long как ключевое слово и не компилируют код который использует его.

  • В FCL есть много методов, которые имеют имена типов как часть имен их методов. Для Например, тип BinaryReader предлагает такие методы, как ReadBoolean, ReadInt32, ReadSingle и т.д., а тип System.Convert предлагает такие методы, как ToBoolean, ToInt32, ToSingle и т.д. Хотя законно написать следующее код, строка с float кажется мне очень неестественной, и не очевидно, что линия правильно:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • Многие программисты, использующие С#, имеют тенденцию забывать о том, что другое программирование языки могут использоваться против CLR, и из-за этого С# -измерения ползут в класс библиотеки. Например, Microsoft FCL почти исключительно написана на С# и разработчики из команды FCL теперь внедрили методы в библиотеку, такие как Массив s GetLongLength, который возвращает значение Int64, которое является длинным на С#, но не на других языках (например, С++/CLI). Другим примером является System.Linq.Enumerable s LongCount.

Ответ 2

Это действительно усложнит код, если у вас есть собственные типы String, Int32 и т.д., которые могут быть использованы вместо System.* - и, пожалуйста, не делайте этого!

В конечном счете это личное предпочтение. Я использую псевдонимы повсюду, но я знаю, что некоторые люди (например, Джеффри Рихтер) советуют никогда не использовать их. Это, наверное, хорошая идея быть последовательной, чтобы все. Если вам не нравится это правило StyleCop, отключите его.

Обратите внимание, что имена методов и т.д. должны использовать имя фрейма, а не псевдоним, чтобы быть нейтральным по отношению к языку. Это не так важно для частных/внутренних членов, но вы можете также иметь те же правила для частных методов, что и общедоступные.

Ответ 3

Поскольку встроенный псевдоним является более естественным способом выражения концепции на этом языке.

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

Ответ 4

Это правило StyleCop предполагает, что использование псевдонимов приводит к меньшему путанице с так называемым "средним языком пользователя". Который знает, например, "длинный" тип, но как-то пугающий тип "System.Int64" и путается, а затем видит его. Лично я думаю, что это importatnt просто быть последовательным в вашем стиле кода, это невозможно удовлетворить всех.

Ответ 5

Меньше запутывания? Мне кажется очень неудобным для базового типа данных, который традиционно является просто значением, включая статические функции. Я понимаю, что использование базового типа данных эквивалентно, если вы просто сохраняете значение, но для доступа к членам класса кажется очень неудобным поставить a. (Dot) после имени базового типа.

Ответ 6

Аналогия может помочь: string - это System.String как мушкет для винтовки. string - это реликвия старого языка и предназначена для старых программистов. С# не имеет "встроенных" типов данных, и эти псевдонимы предоставляются для поколения программистов "С", у которых есть проблемы с этой концепцией.