这是我的代码,在我的帮助下,我尝试在引用同一个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块中打印消息,表明myref
和myref2
指向不同的对象:
引用不相等。
怎么可能这样?我在Group
函数的开头只创建了一次Main
struct实例。
答案 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
这是"拳击"导致在堆上创建两个不同的对象,现在将用于进行比较。您可以使用SOS来验证这一点。
所以我们最终在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 。