我一直想知道两个变量是否指向同一个类的实例。听起来很明显,但可以吗?
例如。想象一下,你有一个名为“IsSameInstanceAs”的运算符的代码如下。是否有任何方法可以实现“IsSameInstanceAs”运算符的逻辑,如使用.Net,C#在if语句中的注释中所述: -
public class MyClass
{
public String MyString;
public static void TestForSameInstance()
{
MyClass myInstanceA = new MyClass();
MyClass myInstanceB = myInstanceA;
MyClass myInstanceC = new MyClass();
myInstanceA.MyString = "A String";
myInstanceC.MyString = myInstanceA.MyString;
if (myInstanceA IsSameInstanceAs myInstanceB)
{
// These are the same instance so they will match and this if is true
}
if (myInstanceA IsSameInstanceAs myInstanceC)
{
// These are not the same instance so they will not match and this if is false
}
}
}
我相信这不可能做到,但如果有人知道更好,请帮助。请记住,我不想比较对象实例,我想知道它们是否是同一个实例。
John Thompson
答案 0 :(得分:2)
Object.ReferenceEquals是相关方法。
确定指定的Object实例是否相同 实例
答案 1 :(得分:0)
if (Object.ReferenceEquals(myInstanceA, myInstanceB))
来自文档:
“确定指定的Object实例是否相同 实例“。
答案 2 :(得分:0)
通常,当您在对象上使用比较==
运算符时,它就是它的功能
但是,如果对象的类型实现了比较运算符的oveerload,则可能不适用,在这种情况下,您始终可以使用object.Reference.Equals(x,y)
所以大多数类型几乎都来自BCL(字符串是一个值得注意的例外)
你可以做到
x == y; //reference comparison for most reference types
object.ReferenceEquals(x,y); //works in all cases
x.Equals(y); //reference comparison for most reference types
第一个和最后一个不同之处在于,在第一个编译时类型中,重要的是在后者中它是运行时类型。即使编译时和运行时类型相同,它们也无法保证它们会产生相同的结果(它们应该只有良好的方式强制执行此操作)
因为它是第一个例子中表达式的编译时类型,所以重要的是你可以将它重写为
(object)x == (object)y; //always a reference comparison for reference types
我个人使用object.ReferenceEquals而不是== with casts。对我来说,这个方法更明确地表明了意图。
答案 3 :(得分:0)
来自MSDN:
以下示例使用ReferenceEquals确定两个对象是否是同一个实例。
class MyClass {
static void Main() {
object o = null;
object p = null;
object q = new Object();
Console.WriteLine(Object.ReferenceEquals(o, p));
p = q;
Console.WriteLine(Object.ReferenceEquals(p, q));
Console.WriteLine(Object.ReferenceEquals(o, p));
}
}
这将产生以下输出:
True
True
False
如果ReferenceEquals(Object objA, Object objB)
与true
的实例相同,或者两者都是objA
, objB
将返回null
;否则,false
。