【发布时间】:2019-06-27 14:30:54
【问题描述】:
最近我在徘徊是否可以通过引用比较结构。由于读取结构变量会创建该变量的副本,因此通过引用比较标准结构似乎是不可能的。但是使用 C# 7 refs 会更有意义。
我定义了 4 个变量
MyStruct foo = new MyStruct(){SomeInt = 1};
ref MyStruct refFoo = ref foo;
MyStruct bar = new MyStruct() { SomeInt = 2 };
ref MyStruct refBar = ref foo;
鉴于 MyStruct 是一个标准结构
struct MyStruct
{
public int SomeInt { get; set; }
}
当我尝试这个:var comparison1 = ReferenceEquals(refFoo, refBar); 时,我收到 警告 说该值始终为 false,因为我正在传递值类型。
如果我改用 C# 7 ref struct
ref struct MyStruct
{
public int SomeInt { get; set; }
}
当我尝试这个:var comparison1 = ReferenceEquals(refFoo, refBar);,我得到一个编译错误,说MyStruct 不能分配给参数类型object。如果我尝试同样的事情:var comparison1 = ReferenceEquals(foo, bar);
最后一种情况是MyStruct 是ref struct,但是refFoo 和refBar 变量声明时没有ref。 (我得到与第二种情况相同的错误)
static void Main(string[] args)
{
MyStruct foo = new MyStruct(){SomeInt = 1};
MyStruct refFoo = foo;
MyStruct bar = new MyStruct() { SomeInt = 2 };
MyStruct refBar = foo;
var comparison1 = ReferenceEquals(refFoo, refBar);
}
ref struct MyStruct
{
public int SomeInt { get; set; }
}
- 那么,是否有一些偷偷摸摸的方法来通过引用比较结构?
- 额外问题:为什么只有第 2 和第 3 个示例给我一个汇编 错误?
【问题讨论】:
-
为什么只有第二个例子给我一个编译错误?因为
ref struct不能装箱。 -
@PetSerAl 不知道。这就是我要问的部分内容:)
-
按照我的理解,ref structs 只需要在堆栈上,您无法获得对它的引用,就像您无法获得对堆栈分配数组的引用一样。这里的区别是编译器没有暴露幕后存在的指针。
-
@JeffMercado 谢谢,这可以解释“bouns 问题”。