相关疑难解决方法(0)

编写equals运算符时处理null的最佳方法

可能重复:
如何在没有无限递归的情况下检查'=='运算符重载中的空值?

当我为对象重载==运算符时,我通常写这样的东西:

    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)

如果你没有向下转换为对象,那么函数可以自我复制,但我不得不怀疑是否有更好的方法?

c# equals operator-overloading

7
推荐指数
2
解决办法
1万
查看次数

C#相等运算符覆盖(==和!=)

可能重复:
如何在没有无限递归的情况下检查'=='运算符重载中的空值?

我有一个看起来像这样的对象:

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)

既然ynull.

我已经尝试将此功能更改为:

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)

.net c# operator-overloading

6
推荐指数
2
解决办法
940
查看次数

C#中相等的最小代码

在这篇文章中,Eric Lippert在第9点建议C#"过于平等".他指出,有9或10种不同的方法或运算符可以重载以提供对象相等性.

我的第一个问题是 - 如果重写了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而无需明确执行此操作的代码?

在C++中,这种行为有先例.编译器可以在需要生成临时变量的某些位置调用复制构造函数.我至少95%确定这不会发生在C#中,但它实际上取决于编译器的构造方式以及边缘情况.

第二个问题是 - 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只使用Object.Equals(object)方法和IEquatable进行如果类型将用于排序或在确定对象的等级时需要使用其他时间,则使用等式测试和IComparable吗?换句话说 - 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗?

假设代码仅在项目中使用,不会导出供第三方使用.

c# equality equals

4
推荐指数
1
解决办法
392
查看次数

运算符重载给出错误

我有一个名为 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)

.net c#

3
推荐指数
1
解决办法
735
查看次数

我如何实现==并在c#中检查null

可能重复:
比较参考类型的两个实例的"最佳实践"是什么?
如何在没有无限递归的'=='运算符重载中检查空值?

我有一个名为"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)

c# operator-overloading

-2
推荐指数
1
解决办法
224
查看次数

标签 统计

c# ×5

operator-overloading ×3

.net ×2

equals ×2

equality ×1