检查实际的空 System.Object 是否等于空 system.object
Check if the actual empty System.Object equals empty system.object
考虑一下:
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
是 new object
而不是,比如说,重新分配。
本质上,检查运行时类型就足够了。
2 个不同的 Object
实例总是不同的。没有 .Net 比较会声明它们相同:
Object.ReferenceEquals
- 2 个新操作 Object
将始终具有不同的参考身份
Object.Equal
定义为引用相等
Object operator ==
也定义为引用相等。
您不能重新定义 Object.Equals
或 ==
,因为您需要先导出 class。
比较持有 Object
个实例的 2 个变量的值的唯一情况是:
- 两者都持有对同一对象实例的引用
- 都是
null
即Object
的 属性 经常用于创建唯一的 "lock only" 对象,以向 lock
提供对象的私有实例。
如果您知道两个 new object()
不同并且只想检查您的对象是否属于 Object
类型,您可以使用 GetType
and check it against typeof
:
var o = new object();
bool eq = o.GetType() == typeof(object); // True
int i = new Int32();
bool eq2 = i.GetType() == typeof(object); // False
考虑一下:
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
是 new object
而不是,比如说,重新分配。
本质上,检查运行时类型就足够了。
2 个不同的 Object
实例总是不同的。没有 .Net 比较会声明它们相同:
Object.ReferenceEquals
- 2 个新操作Object
将始终具有不同的参考身份Object.Equal
定义为引用相等Object operator ==
也定义为引用相等。
您不能重新定义 Object.Equals
或 ==
,因为您需要先导出 class。
比较持有 Object
个实例的 2 个变量的值的唯一情况是:
- 两者都持有对同一对象实例的引用
- 都是
null
即Object
的 属性 经常用于创建唯一的 "lock only" 对象,以向 lock
提供对象的私有实例。
如果您知道两个 new object()
不同并且只想检查您的对象是否属于 Object
类型,您可以使用 GetType
and check it against typeof
:
var o = new object();
bool eq = o.GetType() == typeof(object); // True
int i = new Int32();
bool eq2 = i.GetType() == typeof(object); // False