Struct C#7之后的结构上的ReferenceEquals
由于C#7.2,可以在结构上使用“ref”关键字来创建嵌入引用。如何确定两个结构变量是否指向同一引用Struct C#7之后的结构上的ReferenceEquals,struct,c#-7.0,Struct,C# 7.0,由于C#7.2,可以在结构上使用“ref”关键字来创建嵌入引用。如何确定两个结构变量是否指向同一引用ReferenceEquals始终返回false: 样本代码: struct MyStruct { public string Name { get; set; } } static void Main(string[] args) { MyStruct val1 = new MyStruct() { Name = "Value1" }; MyStruct val2 =
ReferenceEquals
始终返回false
:
样本代码:
struct MyStruct
{
public string Name { get; set; }
}
static void Main(string[] args)
{
MyStruct val1 = new MyStruct() { Name = "Value1" };
MyStruct val2 = new MyStruct() { Name = "Value2" };
MyStruct val4 = new MyStruct() { Name = "New name" };
ref var val3 = ref val1;
val1.Name = "New name";
Console.WriteLine("Val 1: " + val1.Name);
Console.WriteLine("Val 2: " + val2.Name);
Console.WriteLine("Val 3: " + val3.Name);
Console.WriteLine("Val3 eq Val1: " + val3.Equals(val1));
Console.WriteLine("Val3 eq Val2: " + val3.Equals(val2));
Console.WriteLine("Val3 eq Val4: " + val3.Equals(val4));
Console.WriteLine("Val3 ref eq Val1: " + object.ReferenceEquals(val3, val1));
Console.WriteLine("Val3 ref eq Val2: " + object.ReferenceEquals(val3, val2));
Console.ReadKey();
}
输出:
Val 1:新名称
值2:值2
Val 3:新名称
Val3 eq Val1:正确
Val3-eq-Val2:False
Val3 eq Val4:正确
Val3 ref eq Val1:False看看
ref struct是堆栈唯一的值类型,它:
表示顺序结构布局;
只能在堆栈中使用。i、 e.方法参数和局部变量;
不能是类或普通结构的静态成员或实例成员;
不能是异步方法或lambda表达式的方法参数;
不能是动态绑定、装箱、取消装箱、包装或转换
(强调矿山)
他接着实现了Equals
作为
public ref struct MyRefStruct
{
[EditorBrowsable(EditorBrowsableState.Never)]
public override bool Equals(object obj) => throw new NotSupportedException();
// ...
}
有理由
请注意,我已经重写了从System.Object继承的Equals、GetHashCode和ToString方法。因为ref结构不允许装箱,所以您将无法调用这两个基本方法
还请注意
ref结构类型的值不能装箱:
[……]
任何在object或System.ValueType中声明但未在ref struct类型中重写的实例方法都不能用该ref struct类型的接收器调用
也就是说,虽然您可以实现ref struct MyEmbeddedStruct{public override bool Equals(object obj)=>true;}
但只能通过val3.Equals(/*…*/)
调用它,而不能通过object.ReferenceEquals()
调用它。您不能将参数obj
提供给Equals
,因为您必须将参数框起来
因此,您的问题的答案可能是:您无法确定两个(嵌入式)结构是否指向同一引用。(当你处理两个正常结构时,这个问题在一开始就没有任何意义。)Eric Lippert的这篇文章只是关于“正常”结构,但它可能仍然值得一读:ref structs是C#7.2(),我认为问题在于,这个对象。ReferenceEquals(val3,val1)正在装箱我的值,所以我真正应该调用的是类似于struct.ReferenceEquals(ref-val3,ref-val1)
-如果存在类似的东西。。。