Как исправить нарушение StyleCop SA1305 (венгерский)

Мой код содержит переменную с именем «m_d3dDevice».

StyleCop жалуется на это имя:

SA1305: имя переменной «m_d3dDevice» начинается с префикса, похожего на венгерскую нотацию. Удалите префикс или добавьте его в список разрешенных префиксов.

(Обратите внимание, что я вручную отключил SA1308 ("m_"), одно из немногих правил, которым я готов не подчиняться.)

Я не могу разрешить «d3d» в качестве исключения на вкладке «Венгерский язык», так как он допускает только префиксы из 1 или 2 символов, а разрешение «d3» не помогло. Я пробовал все, что мог придумать, чтобы добавить «d3d» в мой файл CustomDictionary (и в любом случае документы подразумевают, что CustomDict не используется для правила 1305).

Любые предложения, чтобы StyleCop разрешил это? Теперь это предмет гордости, чтобы не использовать F2 для моей переменной.


person mpg    schedule 31.01.2011    source источник
comment
что такое 'd3d' аббревиатура?   -  person Piers Myers    schedule 01.02.2011
comment
Я думаю, что единственный способ соблюсти это правило — переименовать вашу переменную во что-то вроде m_direct3DDevice, если это аббревиатура.   -  person Piers Myers    schedule 01.02.2011
comment
Какое нелепое правило и еще более нелепая лакмусовая бумажка для выявления нарушений. Что плохого в том, чтобы просто отключить это правило и поверить, что вы достаточно умны, чтобы называть переменные? Общее правило избегать венгерской нотации, по-видимому, стало таким же нелепым, как и правило, согласно которому ее следует использовать.   -  person Cody Gray    schedule 01.02.2011
comment
Коди: Я с пониманием отношусь к жалобам на то, что SytleCop такой упрямый, так как я также был укушен переменными, такими как m_d14, которые имеют смысл контекстуально (1/4 D), но кажутся нарушениями. вздох -миль на галлон   -  person mpg    schedule 01.02.2011
comment
Лично я бы не хотел поддерживать код, содержащий m_.   -  person Camilo Martin    schedule 19.05.2012


Ответы (4)


Вы можете взглянуть на StyleCop+. Он содержит гибкие правила именования, которые позволят вам заставить все частные поля называться, начиная с «m_» (или как вы пожелаете), вместо того, чтобы отключать проверку имен (как вы это сделали).

По поводу "d3dDevice" - очень интересный случай. Логически он разбивается на следующие слова - { "d", "3", "d", "Device" } или { "d3", "d", "Device" }. И второе «d», похоже, не следует за «верблюжьей нотацией».

Но я твердо верю, что статический анализ (особенно именование) должен быть достаточно гибким, чтобы удовлетворять потребности пользователей. В настоящее время StyleCop+ может поддержать ваш случай следующим образом - например, вы можете добавить "исключение" (сколько хотите) в шаблон именования для приватных полей, чтобы он выглядел так:

m_$(aaBb)
m_d3d$(AaBb)

Скорее всего, это обходной путь, но я подумаю о вашем случае "d3d" - и, возможно, StyleCop+ будет поддерживать что-то подобное.

Спасибо за интересный пример!

person Oleg Shuruev    schedule 01.02.2011
comment
Очень полезный пост, так что +1 от меня. Но в качестве честного предупреждения, поскольку похоже, что вы оба новичок в Stack Overflow и либо являетесь автором, либо тесно связаны с StyleCop+. Возможно, вы захотите сделать свою аффилиацию явной (например, включив простое заявление об отказе от ответственности), чтобы пользователи не решили пометить ваши сообщения как спам. В самом низу раздела FAQ это также кратко обсуждается. Но, тем не менее, добро пожаловать на сайт и спасибо, что поделились своим опытом! - person Cody Gray; 01.02.2011
comment
Посмотрю StyleCop+, спасибо. Однако, поскольку в этом случае, похоже, нет реального ответа, кроме переименования переменной или отключения правила, я отмечу это как лучший ответ... -mpg - person mpg; 01.02.2011
comment
@ Коди Да, ты прав - я автор. Спасибо за предупреждение, я, конечно, не собирался его продвигать. Я буду осторожен с этим. - person Oleg Shuruev; 01.02.2011

Вы также можете отключить stylecop в каждом конкретном случае. например

[System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.StyleCop.CSharp.NamingRules",
    "SA1305:FieldNamesMustNotUseHungarianNotation",
    Justification = "Using Win32 naming for consistency.")]
IntPtr hFile;

Это может быть непривлекательным вариантом, если у вас много оскорбительных имен, но для одного или двух, как правило, нормально.

person Derek Park    schedule 24.04.2013

Вы также можете использовать Settings.StyleCop в файлах пакета для настройки параметров.

Вы можете подавить определенные слова, добавив приведенный ниже код в файл Settings.StyleCop:

<Analyzer AnalyzerId="StyleCop.CSharp.NamingRules">
  <AnalyzerSettings>
    <CollectionProperty Name="Hungarian">
      <Value>as</Value>
      <Value>do</Value>
      <Value>id</Value>
      <Value>if</Value>
      <Value>in</Value>
      <Value>ip</Value>
      <Value>is</Value>
      <Value>mx</Value>
      <Value>my</Value>
      <Value>no</Value>
      <Value>on</Value>
      <Value>to</Value>
      <Value>ui</Value>
      <Value>vs</Value>
      <Value>x</Value>
      <Value>y</Value>
      <Value>z</Value>
      <Value>iOS</Value>
      <Value>IOS</Value>
    </CollectionProperty>
  </AnalyzerSettings>
</Analyzer>

Вы можете подавить само правило Hungarain, добавив следующее в файл Settings.StyleCop

<Analyzer AnalyzerId="StyleCop.CSharp.NamingRules">
  <Rules>
   <Rule Name="FieldNamesMustNotUseHungarianNotation">
    <RuleSettings>
     <BooleanProperty Name="Enabled">
        False
     </BooleanProperty>
    </RuleSettings>
   </Rule>
 </Rules>
</Analyzer>
person 7vikram7    schedule 10.08.2017

Добавление атрибута подавления должно выполняться поверх всех методов, что потребует времени и долгого процесса.

Если вы хотите удалить это правило из своего проекта, попробуйте это

  • Щелкните правой кнопкой мыши на вашем проекте
  • Выберите настройки Stylecop
  • Найти SA1305
  • Снимите отметку с правила из набора результатов
  • Нажмите «Применить» — «ОК».
  • Правила полиции в стиле повтора снова.
person Kurkula    schedule 09.02.2017