Leggere in inglese

Condividi tramite


IEquatable<T>.Equals(T) Metodo

Definizione

Indica se l'oggetto corrente è uguale a un altro oggetto dello stesso tipo.

C#
public bool Equals (T other);
C#
public bool Equals (T? other);

Parametri

other
T

Oggetto da confrontare con l'oggetto corrente.

Restituisce

Boolean

true se l'oggetto corrente è uguale al parametro other; in caso contrario, false.

Esempio

Nell'esempio seguente viene illustrata l'implementazione parziale di una Person classe che implementa IEquatable<T> e ha due proprietà e LastName SSN. Il Equals metodo restituisce True se la SSN proprietà di due Person oggetti è identica; in caso contrario, restituisce False.

C#
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Person : IEquatable<Person>
{
   private string uniqueSsn;
   private string lName;

   public Person(string lastName, string ssn)
   {
      if (Regex.IsMatch(ssn, @"\d{9}"))
        uniqueSsn = $"{ssn.Substring(0, 3)}-{ssn.Substring(3, 2)}-{ssn.Substring(5, 4)}";
      else if (Regex.IsMatch(ssn, @"\d{3}-\d{2}-\d{4}"))
         uniqueSsn = ssn;
      else
         throw new FormatException("The social security number has an invalid format.");

      this.LastName = lastName;
   }

   public string SSN
   {
      get { return this.uniqueSsn; }
   }

   public string LastName
   {
      get { return this.lName; }
      set {
         if (String.IsNullOrEmpty(value))
            throw new ArgumentException("The last name cannot be null or empty.");
         else
            this.lName = value;
      }
   }

   public bool Equals(Person other)
   {
      if (other == null)
         return false;

      if (this.uniqueSsn == other.uniqueSsn)
         return true;
      else
         return false;
   }

   public override bool Equals(Object obj)
   {
      if (obj == null)
         return false;

      Person personObj = obj as Person;
      if (personObj == null)
         return false;
      else
         return Equals(personObj);
   }

   public override int GetHashCode()
   {
      return this.SSN.GetHashCode();
   }

   public static bool operator == (Person person1, Person person2)
   {
      if (((object)person1) == null || ((object)person2) == null)
         return Object.Equals(person1, person2);

      return person1.Equals(person2);
   }

   public static bool operator != (Person person1, Person person2)
   {
      if (((object)person1) == null || ((object)person2) == null)
         return ! Object.Equals(person1, person2);

      return ! (person1.Equals(person2));
   }
}

Person Gli oggetti possono quindi essere archiviati in un List<T> oggetto e possono essere identificati dal Contains metodo , come illustrato nell'esempio seguente.

C#
public class TestIEquatable
{
   public static void Main()
   {
      // Create a Person object for each job applicant.
      Person applicant1 = new Person("Jones", "099-29-4999");
      Person applicant2 = new Person("Jones", "199-29-3999");
      Person applicant3 = new Person("Jones", "299-49-6999");

      // Add applicants to a List object.
      List<Person> applicants = new List<Person>();
      applicants.Add(applicant1);
      applicants.Add(applicant2);
      applicants.Add(applicant3);

       // Create a Person object for the final candidate.
       Person candidate = new Person("Jones", "199-29-3999");
       if (applicants.Contains(candidate))
          Console.WriteLine("Found {0} (SSN {1}).",
                             candidate.LastName, candidate.SSN);
      else
         Console.WriteLine("Applicant {0} not found.", candidate.SSN);

      // Call the shared inherited Equals(Object, Object) method.
      // It will in turn call the IEquatable(Of T).Equals implementation.
      Console.WriteLine("{0}({1}) already on file: {2}.",
                        applicant2.LastName,
                        applicant2.SSN,
                        Person.Equals(applicant2, candidate));
   }
}
// The example displays the following output:
//       Found Jones (SSN 199-29-3999).
//       Jones(199-29-3999) already on file: True.

Commenti

L'implementazione del Equals metodo è progettata per eseguire un test per verificarne l'uguaglianza con un altro oggetto di tipo T, lo stesso tipo dell'oggetto corrente. Il Equals(T) metodo viene chiamato nelle circostanze seguenti:

In altre parole, per gestire la possibilità che gli oggetti di una classe vengano archiviati in una matrice o in un oggetto raccolta generico, è consigliabile implementare IEquatable<T> in modo che l'oggetto possa essere facilmente identificato e manipolato.

Quando si implementa il metodo, definire l'uguaglianza Equals in modo appropriato per il tipo specificato dall'argomento di tipo generico. Ad esempio, se l'argomento di tipo è Int32, definire l'uguaglianza in modo appropriato per il confronto di due interi con segno a 32 bit.

Note per gli implementatori

Se si implementa Equals(T), è anche necessario eseguire l'override delle implementazioni della classe di base di Equals(Object) e GetHashCode() in modo che il relativo comportamento sia coerente con quello del Equals(T) metodo . Se si esegue l'override di , l'implementazione sottoposta a override Equals(Object)viene chiamata anche nelle chiamate al metodo statico Equals(System.Object, System.Object) nella classe . Inoltre, è necessario eseguire l'overload degli op_Equality operatori e op_Inequality . In questo modo tutti i test di uguaglianza restituiscono risultati coerenti, come illustrato nell'esempio.

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0