我有以下代码片段作为我想要执行的操作的示例。在此示例中,我想打印“reference1”。
var reference1 = new TestValueClass() { AValue = "reference1" };
TestValueClass myPointer = null;
var useClass = new TestPointerUsage(myPointer);
myPointer = reference1;
Console.WriteLine(useClass.testValueClass.AValue);
我完全理解为什么它不起作用,因为在第三行中它采用了 myPointer 的引用,当前为“null”并将其存储在内部。
C# 中是否存在将指针的引用传递给对象而不是对象本身的概念?
最简单的解决方案是传递一个包含指针内部的对象,但我想不时检查是否还有其他解决方案。
谢谢
考虑如果
myPointer
超出范围,但 TestPointerUsage
的实例仍然存在,会发生什么。 useClass.testValueClass
指什么?
如果
TestPointerUsage
是 ref struct
,那么你想要的就是可能的。 A ref struct
只能生存在栈上,无法逃逸到堆中,所以不会出现上面的情况。
A
ref struct
可以有 ref
字段,这就是 testValueClass
应该有的样子。
public ref struct TestPointerUsage {
public ref TestValueClass? testValueClass;
public TestPointerUsage(ref TestValueClass? testValueClass) {
this.testValueClass = ref testValueClass;
}
}
public class TestValueClass {
public required string AValue { get; init; }
}
以下代码将打印“reference1”:
var reference1 = new TestValueClass { AValue = "reference1" };
TestValueClass? myPointer = null;
var useClass = new TestPointerUsage(ref myPointer);
myPointer = reference1;
Console.WriteLine(useClass.testValueClass?.AValue);