相关疑难解决方法(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
查看次数

检查对象是否为空的最佳和最快方法

我经常在源代码中看到if(object.ReferenceEquals(myObject,null))的用法,用于检查myObject是否为null而不是我熟悉的if(myObject == null).

是否有任何特殊原因(如速度,可读性等)使用第一种方式而不是第二种方式?你用哪一个?

先感谢您.

.net c#

9
推荐指数
2
解决办法
4万
查看次数

防止索引超出范围错误

我想写一些条件检查,而不必使用try/catch,我想避免获得Index Out of Range错误的可能性

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
 {                
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
       {
           // execute code here
       }
 }
Run Code Online (Sandbox Code Playgroud)

所以我面临的问题是,在第二次检查时,我需要查看是否有一个非空的项目.但是,如果我没有Element[1],我会得到Index Out of Range异常.问题是可能有2个元素,其中一个(或两个)可能有空的Object数组.仅当其中一个Item字符串不为空时,才必须执行代码.

希望,我解释得很好.我如何避免在任何情况下避免异常?

c#

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