通过 ref 将值分配给类成员通过 ref

问题描述 投票:0回答:1

有些事情让我困惑,希望你能澄清。

// This class assumes that T is definitively compatible to TheStruct
class ValueHolder<T> {
  T _value;
  TheStruct _structValue;

  void Test1() {
    _structValue = ref Unsafe<T, TheStruct>(ref _value); // ERROR: _structValue is not a by-ref value
    // _structValue = Unsafe<T, TheStruct>(ref _value); // WORKS: Copy from stack to heap
  }

  void Test2() {
    ref var structValue = ref _structValue;
    structValue = ref Unsafe.As<T, TheStruct>(ref _value); // WORKS: Why, and what implication does it have?
  }
}

所以我的问题是在 Test2 中:为什么我可以在定义

ref var structValue = ref _structValue;
时指定 Unsafe.As 作为 ref。更重要的是,当使用它而不是
_structValue = Unsafe<T, TheStruct>(ref _value);
时,它会产生什么影响?

感谢您的阅读,希望您能为本文带来一些启发。 :)

c# pointers ref unsafe byref
1个回答
0
投票

为什么在定义 ref var structValue = 时可以将 Unsafe.As 指定为 ref 参考_structValue;

因为根据收到的错误,您需要一个 ref 局部变量:

CS8373 The left-hand side of a ref assignment must be a ref variable.

您可以省略中间步骤并执行它:

ref var structValue = ref Unsafe.As<T, TheStruct>(ref _value);

这和的区别

var structValue = Unsafe.As<T, TheStruct>(ref _value);

在第一种情况下,您

structValue
成为_value
别名

从现在开始,您可以在方法主体中将

_value
替换为
structValue
,它将具有相同的行为。

var foo = 42;
ref var bar = ref foo;
bar = 43; // it's as if we have written "foo = 43;"
Console.WriteLine(foo); // 43
© www.soinside.com 2019 - 2024. All rights reserved.