CA2245: не присваивайте свойству себе
Свойство | Значение |
---|---|
Идентификатор правила | CA2245 |
Заголовок | не назначайте свойство самому себе |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | Как предложение |
Причина
Свойство было случайно назначено самому себе.
Описание правила
Компилятор 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: не назначайте символ и его член в той же инструкции.