CA2246: Não atribua um símbolo e seu membro na mesma instrução
Property | valor |
---|---|
ID da regra | CA2246 |
Título | Não atribua um símbolo e seu membro na mesma instrução |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
Um símbolo e seu membro foram atribuídos na mesma declaração. Por exemplo:
// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;
Descrição da regra
Não é recomendável atribuir um símbolo e seu membro, ou seja, um campo ou uma propriedade, na mesma instrução. Não está claro se o acesso do membro foi destinado a usar o valor antigo do símbolo antes da atribuição ou o novo valor da atribuição nesta declaração. Para maior clareza, a instrução multi-assign deve ser dividida em duas ou mais instruções de atribuição simples.
Como corrigir violações
Para corrigir violações, divida a instrução multi-assign em duas ou mais instruções de atribuição simples. Por exemplo, o trecho de código a seguir mostra uma violação da regra e algumas maneiras de corrigi-la com base na intenção do usuário:
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// It is not clear if the user intent in the below statement is to assign to 'Instance1.Field' or 'Instance2.Field'.
// CA2246: Symbol 'a' and its member 'Field' are both assigned in the same statement. You are at risk of assigning the member of an unintended object.
a.Field = a = b;
}
}
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// 'Instance1.Field' is intended to be assigned.
var instance1 = a;
a = b;
instance1.Field = a;
}
}
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// 'Instance2.Field' is intended to be assigned.
a = b;
b.Field = a; // or 'a.Field = a;'
}
}
Quando suprimir avisos
Não reprima violações desta regra.