본인에게는 외부의 물리적 측정 장치를 나타내는 클래스가 있습니다. 단순화 된 버전은 다음과 같다 :IEquatable 구현 변경 가능 유형
public class Device {
public string Tag { get; set; }
public int Address { get; set; }
}
Tag
는 디바이스를 식별하는 사용자 정의 값이다. Address
은 어댑터가 장치와 통신하는 데 사용하는 값입니다. Device
의 두 인스턴스가 동일한 Address
인 경우 동일한 외부 측정 장치가 사용됩니다.
내가 코드에서 IEquatable<T>
를 Equals
를 재정 의하여 및 구현 (Contains
및 Distinct
같은 방법을 사용하는) 그 행동을 모방하고 싶습니다 : 당신이, 내가 Tag
속성을 무시하고있어 볼 수 있듯이
public class Device : IEquatable<Device> {
public string Tag { get; set; }
public int Address { get; set; }
public override bool Equals(object obj) {
return Equals(obj as Device);
}
public bool Equals(Device other) {
if (null == other) return false;
if (ReferenceEquals(this, other)) return true;
return Address.Equals(other.Address);
}
}
Equals
의 구현.
그래서, 내 질문은 : 내가 Equals
의 구현에 Tag
속성을 무시해야 하는가? 그렇게하면 코드를 이해하기가 더 어려워 집니까? 내가하려는 일을하는 더 좋은 방법이 있습니까? Tag
속성이 필요합니다. 종종 사용자가 Address
을 모르거나 Device
에 Address
이 있는지 여부 (App.config 파일에서 처리되므로 사용자는 IDevice
에는 Address
속성이 없음).
업데이트 : 응답
감사합니다 여러분.
그래서 나는 사용자 정의 IEqualityComparer
을 사용해야한다는 것을 모았습니다. 내 실제 코드가 더 비슷해 보이는 경우 그렇게하는 방법에 대한 지침이 있습니까?
public interface IDevice {
string Tag { get; set; }
double TakeMeasurement();
}
internal class Device : IDevice {
public string Tag { get; set; }
public int Address { get; set; }
public double TakeMeasurement() {
// Take a measurement at the device's address...
}
}
기기 유형을 내 IEqualityComparer
으로 확인해야합니까?
public class DeviceEqualityComparer : IEqualityComparer<IDevice> {
public bool Equals(IDevice x, IDevice y) {
Contract.Requires(x != null);
Contract.Requires(y != null);
if ((x is Device) && (y is Device)) {
return x.Address.Equals(y.Address);
}
else {
return x.Equals(y);
}
}
public int GetHashCode(IDevice obj) {
Contract.Requires(obj != null);
if (obj is Device) {
return obj.Address.GetHashCode();
}
else {
return obj.GetHashCode();
}
}
}
후속 질문이있는 경우 별도로 질문해야합니다. 이 방법을 사용하면 서로 다른 두 가지 질문을 통해 어느 부분이 응답되고 있는지에 대한 혼란없이 좋은 답변을 얻을 수 있습니다.물론 일부 문맥에 대해 이전 질문에 대한 참조를 넣을 수 있습니다 (그리고 새 질문에 관련 비트를 복사 할 수 있습니다). – Chris