首页 >后端开发 >C++ >为什么 C# 不允许字段保存引用,有哪些替代方案?

为什么 C# 不允许字段保存引用,有哪些替代方案?

DDD
DDD原创
2025-01-06 03:12:39690浏览

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

C# 类字段中的引用赋值

在 C# 中,尝试通过“引用”对类字段进行赋值可能会导致意外行为。考虑以下代码:

public class X
{
    public X()
    {
        string example = "X";

        new Y(ref example);

        new Z(ref example);

        System.Diagnostics.Debug.WriteLine(example);
    }
}

public class Y
{
    public Y(ref string example)
    {
        example += " (Updated By Y)";
    }
}

public class Z
{
    private string _Example;

    public Z(ref string example)
    {
        this._Example = example;

        this._Example += " (Updated By Z)";
    }
}

var x = new X();

预期输出是“X(由Y更新)(由Z更新)”,但只打印“X(由Y更新)”。出现此行为的原因是为字段分配“引用参数”会丢失引用。

为什么字段不能保存引用?

只有三种可能的选项考虑“ref 类型”字段:

  1. 禁止 ref 字段类型:这是 C# 中的当前行为。
  2. 允许引用类型的不安全字段:这将允许访问不安全内存的可能性,从而可能导致不可预测的行为。
  3. 将局部变量存储在栈外:这会阻止将局部变量存储在临时内存池中的优化,即不可取。

选择选项 1 是为了确保程序稳定性并防止在代码中创建定时炸弹。

如何实现类似引用的行为

虽然您不能拥有 ref 类型的字段,但还有其他方法可以实现类似引用的效果行为:

  • 创建一个封装引用的类:您可以创建一个提供 getter 和 setter 方法的类来访问和修改引用的变量。这是引用另一个变量的间接方式。
  • 使用 C# 7 功能(Ref 局部变量和 Ref 返回方法): 虽然 C# 不支持在字段中存储引用,但它支持 ref 局部变量和 ref 返回方法。这允许您创建可以通过引用传递并通过多种方法修改的 ref 变量。

以上是为什么 C# 不允许字段保存引用,有哪些替代方案?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn