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étodoPeek()recupera o elemento mais antigo da fila sem removê-lo, fazendo com queconsultaeprimeiroFunccompartilhem 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
FuncionariosobrescerverEquals()ou==, os resultados podem diferir. - Clareza no Código: Utilize nomes descritivos para classes e variáveis, como
Funcionarioem vez deStudent, para evitar ambiguidades.