Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

351
Views
¿Por qué hay copias ocultas creadas por el compilador al comparar C# Value Tuples con ==?

La igualdad entre los tipos de tupla de valor se introdujo en C# 7.3. Permite código como este:

 var x = (1, 2); var y = (1, 2); if(x == y) ...

Esto funciona bien y da el resultado correcto. Sin embargo, el compilador introduce copias ocultas de los objetos de tupla y los compara en su lugar, dando el equivalente a esto:

 var V_3 = x; var V_4 = y; if(V_3.Item1 == V_4.Item1 && V_3.Item2 == V_4.Item2) ...

¿Son V_3 y V_4 solo copias defensivas? Si es así, ¿de qué se están defendiendo?

Este es el más pequeño, por ejemplo, que se me ocurrió, pero lo he intentado con estructuras definidas por el usuario y devoluciones/propiedades de métodos como miembros de tupla también con resultados similares (no siempre idénticos).

Estoy usando v5.0.202 de .Net SDK y C# v9, pero he visto este comportamiento desde .Net Core 3.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

La respuesta es que MSIL, el lenguaje intermedio que está descompilando en C#, es un lenguaje basado en pilas, y los lenguajes basados en pilas tienen dificultades para hacer referencia a lo que no está en la parte superior de la pila. Entonces, en su lugar, puede agregar una variable local y almacenar resultados que no puede alcanzar fácilmente.

Y la razón por la que esta aparente ineficiencia no se optimiza es que simplemente no importa. Cuando se aplica JIT al código nativo, el compilador emite comparaciones directas y un salto como cabría esperar:

 var rng = new Random(); var v1=(rng.Next(), rng.Next()); var v2=(rng.Next(), rng.Next()); return v1 == v2;

genera (saltando la inicialización y restaurando la pila en el prólogo):

 L004f: cmp edi, ebp L0051: jne short L0064 L0053: cmp ebx, eax L0055: sete al // == && ==? L0058: movzx eax, al // return true && 2nd equality result L0063: ret L0064: xor eax, eax // return false L006e: ret
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!