ReferenceEquals为引用相同struct实例的变量返回false

时间:2018-06-16 02:55:53

标签: c# .net struct reference

这是我的代码,在我的帮助下,我尝试在引用同一个struct实例的两个变量上调用object.ReferenceEquals方法:

static void Main(string[] args)
{
    var myref = new Group();
    var myref2 = myref;
    if (object.ReferenceEquals(myref, myref2))
    {
        Console.WriteLine("The references are equal.");
    }
    else
    {
        Console.WriteLine("The references are NOT equal.");
    }
}

结构Group的定义如下:

struct Group
{
    public int StudentCount { get; set; }
}

有趣的是,它在else块中打印消息,表明myrefmyref2指向不同的对象:

  

引用不相等。

怎么可能这样?我在Group函数的开头只创建了一次Main struct实例。

2 个答案:

答案 0 :(得分:0)

结构由传递,而不是通过引用传递。你有两个struct实例,因为在赋值时,值被复制 - 没有被引用。

答案 1 :(得分:0)

我做了一些更多的研究,最终可以根据迈克的评论找到具体的东西。重现this博客的相关部分,其中讨论了ReferenceEquals structs非常重要的行为,static void Main(string[] args) { int valueVar = 15; if (Object.ReferenceEquals(valueVar, valueVar)) Console.WriteLine("Reference Equal"); else Console.WriteLine("Reference Not Equal"); Console.ReadLine(); } // Will always print "Reference Not Equal" 是值类型。这里取代了一个结构,他取了一个整数值,它也是一个值类型。结果保持不变。

TL; DR; Object.ReferenceEquals(valueVar,valueVar)总是为struct返回false,因为它是相同的变量或不同的变量。

详细信息:ReferenceEquals方法通常用于确定两个对象是否是同一个实例。但是当你将它与Value Types一起使用时,你需要保持谨慎。请考虑以下代码:

Object.ReferenceEquals

此代码将始终打印"参考不等于"只要valueVar是Value Type的变量(也包括struct)。如果您检查ReferenceEquals,它将被设计为将两个对象作为输入参数。因此,当您将值类型传递给它时,.NET继续进行,并且#34; Boxes"参数。这是为上面的代码生成的相应MSIL

enter image description here

这是"拳击"导致在堆上创建两个不同的对象,现在将用于进行比较。您可以使用SOS来验证这一点。

enter image description here

所以我们最终在0x01d917e0(一个对象的地址)和0x01d917ec(其他对象的地址)之间的对象之间进行Object.ReferenceEquals(valueVar, valueVar),这显然会失败(请记住这些现在是引用类型对象,因此地址会被比较并返回虚假。

即使Ext.create('Ext.form.Panel', { fullscreen: true, items: [{ xtype: 'fieldset', title: 'About you', items: [{ xtype: 'textfield', label: 'Name', name: 'name' }, { xtype: 'textareafield', label: 'Bio', maxRows: 4, name: 'bio' }] }] }); 传递与两个参数相同的变量,它总是会返回 false