检查实际的空System.Object是否等于空system.object

时间:2015-07-23 04:25:06

标签: c# clr

考虑一下:

var o = new object();

如何在运行时检查o是否与new object()相同。

这失败了:

  var o = new object();
  var eq1 = o.Equals(new object());
  var eq2 = o.Equals(default(object));
  var eq3 = o == new object();
  var eq4 = Object.Equals(o, new object());
  var eq5 = Object.ReferenceEquals(o, new object());

所有eq个变量均为false

编辑:我希望告诉我onew object而不是重新分配。 基本上,检查运行时类型就足够了。

2 个答案:

答案 0 :(得分:2)

如果您知道两个new object()不同,并且只想检查您的对象是否为Object类型,则可以使用GetType并针对typeof进行检查:< / p>

var o = new object();
bool eq = o.GetType() == typeof(object); // True

int i = new Int32();
bool eq2 = i.GetType() == typeof(object); // False

答案 1 :(得分:1)

Object的2个不同实例总是不同的。没有.Net比较会声明它们是相同的:

  • Object.ReferenceEquals - 2个新的操作Object将始终具有不同的参考标识
  • Object.Equal定义为引用相等
  • Object operator ==也被定义为引用相等。

您无法重新定义Object.Equals==,因为您需要先导出课程。

比较保持Object个实例的2个变量的值的唯一情况是:

  • 都保持对对象的同一个实例的引用
  • 都是null

即。 Object的此属性经常用于创建唯一的“仅锁定”对象,以便将对象的私有实例提供给lock