CA1500 по сравнению с SA1309 - Какой побеждает?

Я снабжу префиксом путем высказывания, что я понимаю, что и Анализ кода и 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.

Что делает Вас, парни обычно делают? И что еще более важно, что, авторы этих правил думают, что необходимо сделать (поскольку ни один не предоставляет альтернативные решения в их документации)?

20
задан Jerad Rose 9 July 2010 в 18:24
поделиться

4 ответа

Отключаем SA1309. Причина этого довольно слабая.

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

Если у вас действительно есть разработчики, которые все еще используют "m_", и вам все еще нужно это проверить, вы можете написать небольшое правило для этого.

23
ответ дан 30 November 2019 в 00:55
поделиться

Единственная альтернатива, которую я могу придумать, которая бы удовлетворяла обоим правилам и которую я действительно видел где-либо, - это что-то вроде следующего. Я сам не соблюдаю эту конвенцию, поскольку она кажется неуклюжей.

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);
        }
    }
}
-1
ответ дан 30 November 2019 в 00:55
поделиться

Основываясь на том, что я видел от самой Microsoft, я считаю, что CA1500 побеждает.

Если вы посмотрите на BCL, большая часть кода префиксирует локальные поля подчеркиванием.

2
ответ дан 30 November 2019 в 00:55
поделиться

Вот мое обычное решение:

class SomeClass
{
    int SomeField{get;set;}

    public SomeClass(int someField)
    {
        SomeField = someField;
    }
}
3
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: