Поделиться через


CA1500: имена переменных не должны совпадать с именами полей

TypeName

VariableNamesShouldNotMatchFieldNames

CheckId

CA1500

Категория

Microsoft.Maintainability

Критическое изменение

При нарушении в параметре, имя которого совпадает с именем поля

  • Не критическое — если поле и метод, объявляющий параметр, недоступны для кода за пределами сборки, независимо от произведенных изменений.

  • Breaking — если изменяется имя поля и видимо за пределами сборки.

  • Критическое — если изменяется имя параметра и метод, который его объявляет, доступен для кода за пределами сборки.

При нарушении в локальной переменной, имя которой совпадает с именем поля

  • Не критическое — если поле недоступно для кода за пределами сборки, независимо от произведенных изменений.

  • Не критическое — если изменяется имя локальной переменной, а имя поля не изменяется.

  • Критическое — если изменяется имя поля и видимо за пределами сборки.

Причина

Метод экземпляра объявляет параметр или локальную переменную, имя которой совпадает с именем поля экземпляра объявляющего типа. Чтобы обнаружить локальные переменные, которые нарушают данное правило, проверяемую сборку следует построить с использованием отладочной информации, и соответствующий PDB-файл базы данных программы должен быть доступен.

Описание правила

Если имя поля экземпляра совпадает с именем параметра или локальной переменной, то внутри основной части метода доступ к этому полю осуществляется с помощью ключевого слова this (Me в Visual Basic). При поддержании кода можно легко забыть это различие и предположить, что параметр или локальная переменная ссылаются на поле экземпляра, что влечет за собой ошибки. Подобная путаница особенно часто встречается в объемных телах методов.

Устранение нарушений

Чтобы устранить нарушение данного правила, переименуйте параметр/переменную или поле.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показаны два нарушения данного правила.

Imports System

Namespace MaintainabilityLibrary

   Class MatchingNames

      Dim someField As Integer

      Sub SomeMethodOne(someField As Integer)
      End Sub

      Sub SomeMethodTwo()
         Dim someField As Integer
      End Sub

   End Class

End Namespace
using System;

namespace MaintainabilityLibrary
{
   class MatchingNames
   {
      int someField;

      void SomeMethodOne(int someField) {}

      void SomeMethodTwo()
      {
         int someField;
      }
   }
}