Сделать значения экземпляров равными

#c# #equality

#c# #равенство

Вопрос:

Как сделать это правдой????

             Student studentInstance1 = new Student();
            Student studentInstance2 = new Student();
            studentInstance1.Name = "qwerty";
            studentInstance2.Name = "qwerty";
            if(studentInstance1==studentInstance2)
  

Мне нужен ответ, как сделать значения этого экземпляра равными???

Комментарии:

1. Перегрузка == оператора. (И .Equals тоже.) msdn.microsoft.com/en-us/library/aa288467 (v= против 71).aspx

Ответ №1:

Правильным способом будет переопределить Equals() GetHashCode() методы and в вашем Student классе. Вот статья в msdn о том, как это сделать: http://msdn.microsoft.com/en-GB/library/ms173147 (v= против 90).aspx

Ответ №2:

Как было предложено @DIneshBalan Mahendran, вам нужно будет перегрузить == оператор. Это пример сравнения двух экземпляров по имени, но вы можете расширять его сколько угодно.

 public static bool operator ==(Student student1, Student student2)
{
   return student1.Name.Equals(student2.Name);
}
  

Ответ №3:

 public static bool operator ==(Student a, Student b){
    return a.Name == b.Name;
}
public static bool operator !=(Student a, Student b){
    return !(a==b);
}
  

Обратите внимание, что в C # вам приходится == одновременно перегружать операторы != and .

Комментарии:

1. Контрпример: исключение NullException при попытке сравнения с null, например Stundent a = new Student(); if (a == null)...

Ответ №4:

Вы также можете сравнить оба объекта напрямую, если они оба имеют одинаковое свойство, и только тогда оно вернет true .

Теперь я рассматриваю класс Student, который имеет только одно свойство Name.

например

 Student Student1=new Student();
Student Student2=new Student();

Student1.Name="qwerty";
Student2.Name="qwerty";
  

Таким образом, вы можете использовать:

 bool bIsEqual=Student1.Equals(Student2);
  

И если вы хотите сравнивать только строки, вы также можете использовать :

 bool bIsEqual=Student1.Name.Equals(Student2.Name, StringComparision.OrdinalIgnoreCase);
  

Ответ №5:

Если вы хотите реализовать пользовательские правила равенства, вам необходимо реализовать

   Equals
  GetHashCode
  == operator
  != operator
  

Что-то вроде этого:

   public class Student {
    public override Boolean Equals(Object obj) {
      if (Object.ReferenceEquals(this, obj))
        return true;

      Student other = obj as Student;

      if (Object.ReferenceEquals(null, other))
        return false;

      return String.Equals(Name, other.Name, StringComparison.Ordinal);
    }

    public override int GetHashCode() {
      return String.IsNullOrEmpty(Name) ? 0 : Name.GetHashCode();
    }

    public static Boolean operator ==(Student left, Student right) {
      if (Object.ReferenceEquals(left, right))
        return true;
      else if (Object.ReferenceEquals(null, left) || 
               Object.ReferenceEquals(null, right))
        return false;

      return String.Equals(left.Name, right.Name, StringComparison.Ordinal);
    }

    public static Boolean operator !=(Student left, Student right) {
      return !(left == right);
    }

    ...

    // You'd rather had Name being immutable: once assigned and neber changed
    public Student(String name) {
      Name = name;
      ...
    }

    // You'd rather had Name being immutable
    public String Name {
      get;
      private set;    
    }
  }
  

Еще одна проблема с Name собственностью, она должна быть неизменяемой, просто посмотрите:

   if (studentInstance1 == studentInstance2) {
    // From now studentInstance1 is not equal to studentInstance2 any more! 
    studentInstance1.Name = 'Some other name';

  ...

  Dictionary<Student, int> quizResults = new Dictionary<Student, int> {
    {studentInstance1, 90}
    {studentInstance2, 85}};

  studentInstance1.Name = 'Some other name';
  int result = quizResults[studentInstance1]; // <- Exception