Вы могли бы найти следующее сообщение полезным: http://refactoringin.net/?p=36
, Как это сказано в сообщении, не отбрасывайте полную перезапись настолько легко. Кроме того, если вообще возможный, попытайтесь заменить целые слои или уровни со сторонним решением как, например ORM для персистентности или с новым кодом. Но самый важный из всех, попытайтесь понять логику (проблемная область) позади кода.
Да, вам нужно изменить идентификатор класса вашего объекта, если вы хотите, чтобы несколько версий сосуществовали. Однако вы можете поддерживать независимый от версии идентификатор программы , такой как «Word.Application» или «InternetExplorer.Application», который перенаправляет на идентификатор класса текущей версии . Поддерживать обратную совместимость очень сложно. MSXML, по-видимому, отказался от практики независимого от версии progID.
Если вы решите сохранить старые интерфейсы (рекомендуется), вам необходимо реализовать как новые, так и старые интерфейсы в вашем новом объекте.
Вы можете проверить Microsoft Office реестр выходит. Он довольно хорошо поддерживает обратную совместимость.
Предлагаемое имя нового интерфейса будет состоять из имени интерфейса плюс номер версии, например IHtmlDocument6 .
t правильно реализовать IEqualityComparer
.
Когда вы реализуете IEqualityComparer
, вы должны реализовать GetHashCode
, чтобы любые два равных объекта имеют тот же хэш-код.
В противном случае вы получите неправильное поведение, как вы видите здесь.
Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вы также необходимо переопределить GetHashCode
в SupplierCategory
для обеспечения согласованности. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
Когда вы реализуете IEqualityComparer
, вы должны реализовать GetHashCode
, чтобы любые два равных объекта имели одинаковый хэш-код.
В противном случае вы приведет к неправильному поведению, как вы видите здесь.
Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
, чтобы быть последовательным. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
Когда вы реализуете IEqualityComparer
, вы должны реализовать GetHashCode
, чтобы любые два равных объекта имели одинаковый хэш-код.
В противном случае вы приведет к неправильному поведению, как вы видите здесь.
Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
, чтобы быть последовательным. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
GetHashCode
, чтобы любые два равных объекта имели одинаковый хэш-код.
В противном случае вы получите неправильное поведение, как видите здесь.
Вам следует реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
, чтобы обеспечить согласованность. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
GetHashCode
, чтобы любые два одинаковых объекта имели одинаковый хэш-код.
В противном случае вы получите неправильное поведение, как вы видите здесь.
Вам следует реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
, чтобы обеспечить согласованность. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
для согласованности. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
public int GetHashCode(List<SupplierCategory> obj) {
int hash = 17;
foreach(var value in obj)
hash = hash * 23 + obj.GetHashCode();
return hash;
}
Вам также необходимо переопределить GetHashCode
в SupplierCategory
для согласованности. Например:
public override int GetHashCode() {
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + Parent.GetHashCode();
return hash;
}
Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals
в SupplierCategory
и заставить его вызывать реализованный вами метод Equals
для IEquatable
.
Собственно, этот вопрос даже описан в документации: http://msdn.microsoft.com/en-us/library/bb338049.aspx .