C# 检查实际空System.Object是否等于空System.Object

C# 检查实际空System.Object是否等于空System.Object,c#,clr,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 = O

考虑这一点:

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

编辑:我想告诉大家,
o
新对象
,而不是重新分配。
基本上,检查运行时类型就足够了。

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

  • Object.ReferenceEquals
    -2新建的op
    Object
    将始终具有不同的引用标识
  • Object.Equal
    定义为引用相等
  • 对象运算符==
    也定义为引用相等
您不能重新定义
Object.Equals
=
中的任何一个,因为您需要首先派生类

比较包含
对象
实例的两个变量的值的唯一情况是:

  • 两者都保留对同一对象实例的引用
  • 两者都是
    null

也就是说,
对象
的此属性经常用于创建唯一的“仅锁定”对象,以提供对象的私有实例来锁定。

如果您知道两个
新对象()
是不同的,并且只想检查您的对象是否属于
对象
类型,则可以使用并检查它:


你的意思是堆中的同一个对象吗?@Rodrigodevarias否我的意思是我的o变量与
new object()完全相同,并且没有运行时值。@zaitsman:它确实有运行时值。你在想
null
可能吗?@zaitsman你介意编辑一下你的问题,这样它就和公认的答案有点关联了吗?
var o = new object();
bool eq = o.GetType() == typeof(object); // True

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