相关疑难解决方法(0)

如何在没有无限递归的'=='运算符重载中检查空值?

以下将导致==运算符重载方法的无限递归

    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)

我如何检查空值?

.net c# operator-overloading

110
推荐指数
4
解决办法
6846
查看次数

什么是比较参考类型的两个实例的"最佳实践"?

我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).

我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).

在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:

  1. 比较两种参考类型的最佳方法是什么?
  2. 我们应该实施IComparable吗?(我还看到提到这应该仅为值类型保留).
  3. 有一些我不知道的界面吗?
  4. 我们应该自己动手吗?!

非常感谢^ _ ^

更新

看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.

如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.

.net c# comparison equality operator-overloading

45
推荐指数
3
解决办法
3万
查看次数

参考平等性能差异?((object)obj1 ==(object)obj2)vs.object.ReferenceEquals(obj1,obj2)

使用该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,而!=第一个变体中很难忽略.

c# performance coding-style readability equality

19
推荐指数
2
解决办法
9606
查看次数

这个重载是什么意思?

有人可以解释一下这个重载是什么意思吗?

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

c# equality referenceequals

19
推荐指数
1
解决办法
1102
查看次数

正确地实现两个具有不同类型但在语义上等效的对象的比较

我发现了类似的问题

如何比较具有相似属性的两个截然不同的对象

这可能含蓄地和/或部分地回答了我的问题.

假设我想要比较(没有很多嵌套条件)这个对象:

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)

由于我也有一个 …

c# design-patterns design-principles

10
推荐指数
1
解决办法
6262
查看次数

Kendo Grid中的多列分组

我使用kendo网格来显示一组记录.但是现在我想使用Aggregates属性对列进行分组并对列执行某些聚合函数.

根据以下文档,我可以在单个列上应用分组,但我想对多列进行分组 http://demos.telerik.com/kendo-ui/grid/aggregates

请建议我如何实现它.

谢谢

telerik-grid kendo-ui kendo-grid

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

重写Equals和GetHashCode不一定会覆盖相等重载运算符

我有以下代码:

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#

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