My Fancy Field Updater抛出。
public static bool UpdateField<T>(ref T target, T value)
{
bool updated;
if (0 != Comparer<T>.Default.Compare(target, value))
{
target = value;
updated = true;
}
else
{
updated = false;
}
return updated;
}
我将此更新程序用于&#39;值类型&#39;,系统&#39;参考类型&#39;和我自己的参考类型&#39;。我的类型没有实现IComparable,我也不打算这样做。在这些情况下,通常可以比较参考文献。
关键是我希望能够将它用于任何事情。是否有不同的实现允许我这样做,或者我是否必须捕获异常并尝试以不同方式处理这些情况?
答案 0 :(得分:4)
看起来你真的不想用“大于或小于”来比较这些值 - 而是为了平等。所以你应该使用EqualityComparer.Default
:
public static bool UpdateField<T>(ref T target, T value)
{
bool updated = !EqualityComparer<T>.Default.Equals(target, value);
if (updated)
{
target = value;
}
return updated;
}
默认的相等比较器执行您想要的类 - 如果类型没有实现IEquatable<T>
或覆盖object.Equals
,它会比较标识的引用。
答案 1 :(得分:1)
您正在使用Comparer检查两个值是否相等,Comparer用于比较两个值(排序,大于,小于等于)。相反,使用:
bool areEqual = EqualityComparer<T>.Default.Equals(target, value);
IComparer接口支持订购比较。也就是说,当 Compare方法返回0,表示两个对象排序相同。 提供了完全相等比较的实现 IEqualityComparer泛型接口。
答案 2 :(得分:-3)
IComparable是一个界面,让您(开发人员)确定是否应将两个对象视为&#34;等于&#34;。您可能对使用界面朋友的抵抗力稍差,因为它有助于您必须完成的工作,并且不需要您生成外部方法来比较对象。 try-catch方法可行,但它很粗糙,你最终会在代码中剪切和粘贴它。
考虑可维护性。