Compartilhar via


CA2246: Não designar um símbolo e o membro dele na mesma instrução

Property Valor
ID da regra CA2246
Título Não designar um símbolo e o membro dele na mesma instrução
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

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 é recomendado 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 visava usar o valor antigo do símbolo antes da atribuição ou o novo valor da atribuição nesta instrução. Para maior clareza, a instrução de atribuição múltipla 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 de atribuição múltipla em duas ou mais instruções de atribuição simples. Por exemplo, o snippet 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 suprima as violações desta regra.

Confira também