当我为对象重载==运算符时,我通常写这样的东西:
public static bool operator ==(MyObject uq1, MyObject uq2) {
if (((object)uq1 == null) || ((object)uq2 == null)) return false;
return uq1.Field1 == uq2.Field1 && uq1.Field2 == uq2.Field2;
}
Run Code Online (Sandbox Code Playgroud)
如果你没有向下转换为对象,那么函数可以自我复制,但我不得不怀疑是否有更好的方法?
我有一个看起来像这样的对象:
public class Tags
{
int mask;
public static bool operator !=(Tags x, Tags y)
{
return !(x == y);
}
public static bool operator ==(Tags x, Tags y)
{
return x.mask == y.mask;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于将实例相互比较,但我也希望能够处理如下表达式:
if(tags1 == null)
Run Code Online (Sandbox Code Playgroud)
这样做会导致以下行出现异常:
return x.mask == y.mask;
Run Code Online (Sandbox Code Playgroud)
既然y是null.
我已经尝试将此功能更改为:
public static bool operator ==(Tags x, Tags y)
{
if (x == null && y == null) return true;
if (x == null || y == null) …Run Code Online (Sandbox Code Playgroud) 在这篇文章中,Eric Lippert在第9点建议C#"过于平等".他指出,有9或10种不同的方法或运算符可以重载以提供对象相等性.
我的第一个问题是 - 如果重写了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而无需明确执行此操作的代码?
在C++中,这种行为有先例.编译器可以在需要生成临时变量的某些位置调用复制构造函数.我至少95%确定这不会发生在C#中,但它实际上取决于编译器的构造方式以及边缘情况.
第二个问题是 - 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只使用Object.Equals(object)方法和IEquatable进行如果类型将用于排序或在确定对象的等级时需要使用其他时间,则使用等式测试和IComparable吗?换句话说 - 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗?
假设代码仅在项目中使用,不会导出供第三方使用.
我有一个名为 Point 的类,它重载“==”和“!=”运算符来比较两个 Point 对象。如何将我的 Point 对象与“null”进行比较,这是一个问题,因为当我使用 null 调用 == 或 != 运算符时,Equals 方法内部会出现问题。请打开一个控制台应用程序,看看我想说什么。我该如何解决。
public class Point
{
public int X { get; set; }
public int Y { get; set; }
public static bool operator == (Point p1,Point p2)
{
return p1.Equals(p2);
}
public static bool operator != (Point p1, Point p2)
{
return !p1.Equals(p2);
}
public override bool Equals(object obj)
{
Point other = obj as Point;
//problem is here calling != operator and this operator calling this …Run Code Online (Sandbox Code Playgroud) 我有一个名为"Criterion"的类,我想实现==运算符,但我正在努力解决以下问题:
当我实现==运算符时,我正在检查我的一个或两个实例是否为空,但是当我这样做时,它会导致递归调用==然后我得到"StackOverflow"(他)异常.
从技术上讲,我可以实现Equals运算符而不是覆盖==,但如果我实现了==运算符,代码将更具可读性.
这是我的代码:
public static bool operator == (Criterion c1, Criterion c2)
{
if (null == c1)
{
if (null == c2)
return true;
return false;
}
if (null == c2)
return false;
if ((c1.mId == c2.mId) && (c1.mName == c2.mName))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)