U C #, koja je razlika između toga kako == operator radi s referentnim tipovima u odnosu na primitive?


Odgovor 1:

Isto kao u Javi: == uspoređuje vrijednosti primitiva, uspoređuje pokazatelje za reference. U osnovi ==, osim ako preopterećeni će usporediti vrijednosti pohranjene na hrpi, ako želite usporediti referentne tipove podataka, poput Stringa za jednakost, morate koristiti metodu .Equals () ovaj će usporediti stvari pohranjene u hrpi.


Odgovor 2:

Sve referentne vrste podržavaju == usporedbu: ako nije preopterećen, operator će izvršiti provjeru referentne jednakosti. Ako je preopterećen za tip, izvršit će provjeru jednakosti vrijednosti kako je definirana tom vrstom. Na primjer, u C # (za razliku od Jave) izvođenje == na žicama radi usporedbu vrijednosti; konkretno, on provodi Ordinalnu usporedbu vrijednosti, tj. usporedbu karaktera prema znaku koji razlikuje velika i mala slova.

Za ugrađene u primitivne tipove vrijednosti == čini očekivanu (budite oprezni s pomičnim i dvostrukim, posebno NaN) vrijednosnu jednakost. Korisnički definirane vrste vrijednosti moraju definirati == i! = Ili će takva usporedba biti nepodržana. Općenito, za većinu građevina u kojima ima smisla želite usporediti za jednakost trebali biste:

  • define == and! = override Equals (objekt) override GetHashCode () implementira IEquatable i sve gore navedeno tako da svaka metoda daje rezultat u skladu s ostalim

Odgovor 3:

U C #, uspoređivanje primitiva uspoređivat će njihove vrijednosti, uspoređivanje referentnih vrsta uspoređivat će reference s referencama (prema zadanim postavkama). Za referentni tip to znači da, uspoređujući dva objekta, osim ako su potpuno ista instanca (ista referenca), oni neće biti jednaki:

klasna osoba
{
  javni niz Naziv {get;}
  
  javna osoba (naziv niza)
  {
    Ime = ime;
  }
}

Stvaramo 2 osobe s istim imenom. Njihove će reference biti drugačije, cparisom će rezultirati lažnim.

var a = nova Osoba ("Tom");
var b = nova osoba ("Tom");

var areEqual = a == b; // lažno

Međutim, možete nadjačati zadano ponašanje nadjačavanjem == operatera:

klasna osoba
{
  javni niz Naziv {get;}
  
  javna osoba (naziv niza)
  {
    Ime = ime;
  }

  javni statički operator bool == (Osoba p1, Osoba p2)
  {
    ako (Object.ReferenceEquals (p1, null)
    {
      ako (Object.ReferenceEquals (p2, null)
      {
        povratak istinit;
      }
    }

    // Sada kada znamo da lijevo nije nulo, možemo usporediti vrijednosti
    vrati ovo.Equals (p2);
  }

  javni statički operator bool! = (Osoba p1, Osoba p2) =>! (p1 == p2);

  javni bool jednak (objekt p)
  {
    // Provjerite ima li desna strana vrijednost.
    ako (Object.ReferenceEquals (p, null)
    {
      vratiti lažno;
    }

    // do sada imamo zadane == implementacije.

    // Obje su reference jednake, znači da je to isti objekt s istim vrijednostima.
    ako (Object.ReferenceEquals (ovo, p)
    {
      povratak istinit;
    }
    
    // Vrste se moraju točno podudarati
    ako (this.GetType ()! = p.GetType ())
    {
      vratiti lažno;
    }
    
    // Konačno možemo usporediti sadržaj svakog objekta.
    vrati ovo.Equals (p.Name);
  }
}

Sada ako ponovo usporedimo ovo dvoje, rezultat će biti točan.

var a = nova Osoba ("Tom");
var b = nova osoba ("Tom");

var areEqual = a == b; // istina