#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