Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2245 |
| Заголовок | Не назначайте свойство самому объекту |
| Категория | Использование |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Свойство было случайно назначено самому себе.
Описание правила
Компилятор C# генерирует предупреждение CS1717: присваивание сделано той же самой переменной; вы имели в виду присвоить что-то другое?, когда полю, локальной переменной или параметру присваивается значение самого себя. Такая ошибка часто встречается в том случае, когда имя локального символа, символа параметра или поля аналогично имени другого символа в области. Вместо разных символов в левой и правой частях назначения использовался один и тот же символ. Это приводит к избыточному назначению значения самому себе и, как правило, указывает на функциональную ошибку.
Назначение свойства самому себе также является функциональной ошибкой практически во всех реальных случаях. Однако в некоторых крайних случаях получение значения свойства может иметь побочные эффекты, а новое значение свойства отличается от исходного значения. Если это так, самоназначение свойства не является избыточным и не подлежит удалению. Это предотвращает вывод компилятором предупреждения CS1717 о назначении свойства самому себе, не приводя к нарушению совместимости в этих случаях.
Правило CA2245 призвано устранить эту проблему. Оно сообщает о нарушении назначения свойства самому себе, чтобы помочь исправить эти функциональные ошибки. Для небольшого набора крайних случаев, когда назначение свойства самому себе является желательным, нарушения CA2245 можно подавить в исходном коде с помощью соответствующего комментария, содержащего обоснование.
Устранение нарушений
Чтобы устранить нарушения, в левой и правой частях назначения следует использовать разные символы. Например, в следующем фрагменте кода показано нарушение правила и способы его устранения:
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// CS1717: Accidentally assigned the parameter 'p' to itself.
p = p;
// CA2245: Accidentally assigned the property 'P' to itself.
P = P;
}
}
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// No violation, now the parameter is assigned to the field.
this.p = p;
// No violation, now the parameter is assigned to the property.
P = p;
}
}
Когда лучше отключить предупреждения
Безопасно игнорировать нарушения в рамках этого правила, если извлечение значения свойства может иметь побочные эффекты, а новое значение свойства отличается от исходного. Если это так, само-присвоение свойства не является избыточным. Чтобы задокументировать это как ожидаемое поведение, в подавление следует добавить комментарий с обоснованием.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2245
// The code that's violating the rule is on this line.
#pragma warning restore CA2245
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2245.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Связанные правила
- CS1717: значит присваивание выполнено той же переменной; вы имели в виду сделать иное присваивание?
- CA2011: не назначайте свойство в его сеттере
- CA2246: не назначайте символ и его член в той же инструкции.