首页 > 后端开发 > C++ > 为什么不能通过引用分配 C# 类字段,以及如何解决这个问题?

为什么不能通过引用分配 C# 类字段,以及如何解决这个问题?

DDD
发布: 2025-01-05 22:01:42
原创
373 人浏览过

Why Can't C# Class Fields Be Assigned by Reference, and How Can This Be Worked Around?

分配给字段时保留引用

在 C# 中,不可能通过“引用”分配给类字段。这是因为字段不能是引用类型。造成这种情况的主要原因有三个:

限制原因:

  1. 不安全的引用字段:允许引用字段将打开可能性在代码中制造“定时炸弹”。假设您将 ref 字段分配给一个局部变量,该变量在方法完成后可能会变得无效,从而导致潜在的崩溃。
  2. 临时存储池: 局部变量通常存储在临时内存池中以优化性能。允许引用字段将需要使用垃圾收集堆,这效率较低。

解决方法:

尽管有限制,但有一个解决方法可以模拟类似引用的行为:

使用委托和操作:

创建一个具有所需值的 getter 和 setter 的委托。将此委托存储在字段中而不是引用中。例如:

sealed class Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

...
Ref<int> x;
void M()
{
    int y = 123;
    x = new Ref<int>(() => y, z => { y = z; });
    x.Value = 456;
    Console.WriteLine(y); // 456
}
登录后复制

在这种情况下,x 存储一个可以获取和设置 y 值的委托。当你设置 x.Value 时,它​​会修改 y.

以上是为什么不能通过引用分配 C# 类字段,以及如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板