以下将导致==运算符重载方法的无限递归
Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);
public static bool operator ==(Foo foo1, Foo foo2) {
if (foo1 == null) return foo2 == null;
return foo1.Equals(foo2);
}
Run Code Online (Sandbox Code Playgroud)
我如何检查空值?
我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).
我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).
在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:
非常感谢^ _ ^
看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.
如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.
使用该object.ReferenceEquals方法使用时会有额外的开销((object)obj1 == (object)obj2)吗?
在第一种情况下,将涉及静态方法调用,并且在两种情况下都涉及到对象的某种形式的转换.
即使编译器平衡了那些方法,那么不等式呢?
(object)obj != null
Run Code Online (Sandbox Code Playgroud)
相比于...
!object.ReferenceEquals(obj,null)
Run Code Online (Sandbox Code Playgroud)
我想在某些时候,会在!=运算符内或者应用于ReferenceEquals方法的结果时发生逻辑否定.你怎么看?
还有可读性问题需要考虑.在检查相等性时,ReferenceEquals似乎更清晰,但是对于不平等,可能会错过!前面的内容object.ReferenceEquals,而!=第一个变体中很难忽略.
有人可以解释一下这个重载是什么意思吗?
public static bool operator ==(Shop lhs, Shop rhs)
{
if (Object.ReferenceEquals(lhs, null))
{
if (Object.ReferenceEquals(rhs, null))
{
return true;
}
return false;
}
return lhs.Equals(rhs);
}
Run Code Online (Sandbox Code Playgroud)
我从未在重载中看到过Object.ReferenceEquals
我发现了类似的问题
这可能含蓄地和/或部分地回答了我的问题.
假设我想要比较(没有很多嵌套条件)这个对象:
class ObjectA {
public string PropertyX { get; set; }
public char PropertyY { get; set; }
public long PropertyZ { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到了System.String.我只对平等或不平等感兴趣(不是关于身份的一系列价值观).
实施IEquatable<string>中 ObjectA是一个正确的选择吗?我不关心什么只是简单的工作,我想确定这种情况的正确模式.
作为其他信息,请考虑ObjectA通常按顺序提供IEnumerable<ObjectA>.
我不需要知道是否"string" ==或!= objectA实例; 不涉及排序.
编辑以澄清(和帮助)
对不起,写一个好问题有时很难......
假设我不能将其表示ObjectA为字符串以进行比较(违反封装不是一种选择).
在上下文中,我要与之匹配PropertyY.
在context-2中,我要将它与应用于PropertyY/ 的算法相匹配PropertyZ.
@Oliver解决方案在问题的最后再次帮助我(再次+1).我可以简单地定义一个自定义界面:
interface IContextConverter {
string ToEquatableStringForContext1();
string ToEquatableStringForContext2();
}
Run Code Online (Sandbox Code Playgroud)
由于我也有一个 …
我使用kendo网格来显示一组记录.但是现在我想使用Aggregates属性对列进行分组并对列执行某些聚合函数.
根据以下文档,我可以在单个列上应用分组,但我想对多列进行分组 http://demos.telerik.com/kendo-ui/grid/aggregates
请建议我如何实现它.
谢谢
我有以下代码:
public enum ClassType
{
I,
II,
}
public enum LocationType
{
A,
B
}
public class Person
{
public LocationType LocType
{ get; set; }
public ClassType ClaType
{ get; set; }
public override bool Equals(object obj)
{
Person obPer = obj as Person;
if (obPer == null)
return false;
if (LocType != obPer.LocType)
return false;
if (ClaType != obPer.ClaType)
return false;
return true;
}
public override int GetHashCode()
{
return LocType.GetHashCode()^ClaType.GetHashCode();
}
}
static void Main(string[] args)
{ …Run Code Online (Sandbox Code Playgroud) c# ×6
equality ×3
.net ×2
coding-style ×1
comparison ×1
kendo-grid ×1
kendo-ui ×1
performance ×1
readability ×1
telerik-grid ×1