外部物理測定デバイスを表すクラスがあります。簡易版は次のようになります。
public class Device {
public string Tag { get; set; }
public int Address { get; set; }
}
Tag
デバイスを識別するためのユーザー定義の値です。Address
アダプターがデバイスと通信するために使用する値です。の 2 つのインスタンスがDevice
同じAddress
である場合、同じ外部測定デバイスが使用されます。
をオーバーライドして実装することにより、コードでその動作を模倣したいと思います(Contains
およびのようなメソッドを使用するため) :Distinct
Equals
IEquatable<T>
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);
}
}
ご覧のとおりTag
、 の実装ではプロパティを無視していますEquals
。
だから、私の質問は:Tag
の実装でプロパティを無視する必要がありEquals
ますか? そうすることで、コードが理解しにくくなりますか? 私がやろうとしていることを行うためのより良い方法はありますか? Tag
プロパティが必要なのは、多くの場合、ユーザーが を知らない、または が(App.config ファイルで処理されている) を持っているAddress
かどうかさえ知らないためです。プロパティがあります)。Device
Address
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();
}
}
}