Como Verificar se Dois Objetos São a Mesma Instância em C#

Em C#, determinar se duas variáveis referenciam o mesmo objeto na memória é essencial para muitas operações. A seguir, um exemplo adaptado com uma classe modificada e variáveis renomeadas para ilustrar esse conceito.

class Funcionario
{
    public int Id { get; set; }
    public string Nome { get; set; }
}

internal class Programa
{
    static void Main(string[] args)
    {
        Queue<Funcionario> filaTrabalho = new Queue<Funcionario>();

        var primeiroFunc = new Funcionario() { Id = 10, Nome = "Ana" };
        var segundoFunc = new Funcionario() { Id = 20, Nome = "Carlos" };

        filaTrabalho.Enqueue(primeiroFunc);
        filaTrabalho.Enqueue(segundoFunc);

        var consulta = filaTrabalho.Peek();

        Console.WriteLine("consulta é primeiroFunc: " + consulta.Equals(primeiroFunc));
        Console.WriteLine("consulta é segundoFunc: " + consulta.Equals(segundoFunc));
        Console.ReadLine();
    }
}

No código acima, consulta retorna o primeiro elemento da fila, que aponta para primeiroFunc. Para confirmar se são a mesma instância, existem três métodos principais.

1. Usando object.ReferenceEquals

bool mesmoQuePrimeiro = object.ReferenceEquals(consulta, primeiroFunc);    // true
bool mesmoQueSegundo = object.ReferenceEquals(consulta, segundoFunc);      // false

2. Usando o Operador ==

bool mesmoQuePrimeiro = (consulta == primeiroFunc);     // true
bool mesmoQueSegundo = (consulta == segundoFunc);       // false

3. Usando o Método Equals

bool mesmoQuePrimeiro = consulta.Equals(primeiroFunc);    // true (comparação padrão de referência)
bool mesmoQueSegundo = consulta.Equals(segundoFunc);      // false

Validação no Exemplo

var consulta = filaTrabalho.Peek(); // consulta refere-se a primeiroFunc

Console.WriteLine(object.ReferenceEquals(consulta, primeiroFunc));    // Saída: True
Console.WriteLine(object.ReferenceEquals(consulta, segundoFunc));     // Saída: False
Console.WriteLine(consulta == primeiroFunc);     // Saída: True
Console.WriteLine(consulta == segundoFunc);       // Saída: False

Considerações Técnicas

  • Funcionamento de Peek(): O método Peek() recupera o elemento mais antigo da fila sem removê-lo, fazendo com que consulta e primeiroFunc compartilhem a mesma referência na memória.
  • Referência vs. Valor: Esses métodos comparam endereços de memória (identidade da instância). Se a classe Funcionario sobrescerver Equals() ou ==, os resultados podem diferir.
  • Clareza no Código: Utilize nomes descritivos para classes e variáveis, como Funcionario em vez de Student, para evitar ambiguidades.

Tags: C# queue object.ReferenceEquals igualdade de instâncias comparação de referências

Publicado em 6-28 06:28