我有下面的代码片段作为我想要做的事情的示例.在这个例子中,我想打印"reference1".

var reference1 = new TestValueClass() { AValue = "reference1" };
TestValueClass myPointer = null;
var useClass = new TestPointerUsage(myPointer);
myPointer = reference1;
Console.WriteLine(useClass.testValueClass.AValue);

我完全理解为什么它不起作用,因为在第3行中,它引用了myPointer,目前为"空"并将其存储在内部.

C#中是否有传递对象指针的引用而不是对象本身的概念?

最简单的解决方案是传递指针内部的对象,但我想不时判断是否还有其他解决方案.

谢谢

推荐答案

想想如果myPointer超出范围,但TestPointerUsage的实例仍然存在会发生什么.useClass.testValueClass指的是什么?

如果TestPointerUsageref struct,您想要的就是可能的.A ref struct只能存在于堆栈上,无法逃到堆中,因此不可能发生上述情况.

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);

Csharp相关问答推荐

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

在发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

XUNIT是否使用测试数据的源生成器?

我如何让我的秒表保持运行场景而不重置

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

Polly重试URL复制值

关于扩展文件类C#的矛盾

在字符串C#之前获取数字

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

在平行内使用跨度.用于循环

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

将两个for循环更改为一条LINQ语句

在C#中通过Matheval使用自定义公式

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

C#中的逻辑运算符用作单词';is';and';and';