Я снабжу префиксом путем высказывания, что я понимаю, что и Анализ кода и StyleCop предназначены как инструкции, и многие люди приняли решение проигнорировать их так или иначе. Однако я хотел бы видеть то, что общее согласие относительно этих двух правил.
В правиле CA1500 говорится, не делают названия параметра и частные имена полей тем же.
В правиле SA1309, с другой стороны, говорится, не снабжают префиксом участников подчеркивание или "m _".
Это оставляет нас с небольшими опциями для различения частных полей поддержки от их соответствующих параметров. Возьмите эти примеры.
SA1309 жалуется:
class SomeClass
{
int _someField;
public SomeClass(int someField)
{
this._someField = someField;
}
}
CA1500 жалуется:
class SomeClass
{
int someField;
public SomeClass(int someField)
{
this.someField = someField;
}
}
Какие опции я имею? Я не хочу делать частное поле PascalCase поддержки, потому что это (я верю довольно универсальный), конвенция для общедоступных полей/свойств. И я не хочу переименовывать один или другой, только ради разрешения неоднозначности.
Таким образом, меня оставляют с одним из вышеупомянутых двух, которые потребовали бы, чтобы я подавил одно из правил SA/CA.
Что делает Вас, парни обычно делают? И что еще более важно, что, авторы этих правил думают, что необходимо сделать (поскольку ни один не предоставляет альтернативные решения в их документации)?
Отключаем SA1309. Причина этого довольно слабая.
Наша команда считает, что общепринятая практика частных участников, начинающихся с подчеркивания, намного перевешивает идею о том, что кто-то может использовать другой редактор в коде, что в любом случае никогда не происходит в нашем магазине. Что касается обеспечения «немедленной дифференциации», подчеркивание тоже делает это.
Если у вас действительно есть разработчики, которые все еще используют "m_", и вам все еще нужно это проверить, вы можете написать небольшое правило для этого.
Единственная альтернатива, которую я могу придумать, которая бы удовлетворяла обоим правилам и которую я действительно видел где-либо, - это что-то вроде следующего. Я сам не соблюдаю эту конвенцию, поскольку она кажется неуклюжей.
public class Class1
{
// prefix private fields with "m"
private int mValue1;
public int Value1
{
get { return mValue1; }
set { mValue1 = value; }
}
private string mValue2;
public string Value2
{
get { return mValue2; }
set { mValue2 = value; }
}
// prefix parameters with "p"
public bool PerformAction(int pValue1, string pValue2)
{
if (pValue1 > mValue1)
{
mValue2 = pValue2;
return true;
}
else
{
return (mValue2 == pValue2);
}
}
}
Основываясь на том, что я видел от самой Microsoft, я считаю, что CA1500 побеждает.
Если вы посмотрите на BCL, большая часть кода префиксирует локальные поля подчеркиванием.
Вот мое обычное решение:
class SomeClass
{
int SomeField{get;set;}
public SomeClass(int someField)
{
SomeField = someField;
}
}