You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#为何未提供行为与值类型一致的引用类型替代包装类?

你提到的「在void方法内修改传入的值类型、调用方直接拿到更新后的值」的需求,C#已经提供了原生的语法支持,根本不需要引入额外的引用包装类:

void UpdateCounter(ref int count, ref int step)
{
    count += step;
    step++;
}

// 调用侧
int a = 10;
int b = 2;
UpdateCounter(ref a, ref b);
// 执行后a=12,b=3,直接修改原变量,无任何额外开销

如果需要批量传递多个可修改的值类型,也可以用ref struct或者自定义结构体搭配ref传递,性能比堆上分配的包装类好得多。

官方不内置通用引用包装类的主要原因
  • 类型系统边界清晰的设计原则:C#从设计之初就明确了值类型按值传递、引用类型按引用传递的核心规则,内置模糊两者边界的包装类会大幅提升开发者的理解成本,尤其是新手很容易混淆「引用类型的引用传递」「值类型的ref传递」「包装类的传值」三者的差异,反而会导致更多不可预期的bug。
  • 歧义问题无法统一处理:如果官方提供通用Ref<T>包装类,会有大量无法统一定义的语义问题:相等性判断是取引用相等还是值相等?运算符重载是沿用值类型的逻辑还是引用类型的逻辑?隐式转换的规则怎么定才能不产生冲突?不同业务场景对这些规则的要求完全不同,官方不可能做出满足所有场景的默认实现。
  • 自定义实现成本极低:如果确实需要符合自己业务需求的引用包装类,十几行代码就能实现一个完全适配自己要求的版本,示例如下:
public class Ref<T> where T : struct
{
    public T Value { get; set; }
    public Ref(T value) => Value = value;
    public static implicit operator T(Ref<T> r) => r.Value;
    public static implicit operator Ref<T>(T value) => new(value);
    public static Ref<T> operator ++(Ref<T> r) { r.Value = (dynamic)r.Value + 1; return r; }
    public static Ref<T> operator --(Ref<T> r) { r.Value = (dynamic)r.Value - 1; return r; }
    // 可根据业务需要补充其他运算符和方法
}

完全可以覆盖特殊场景的需求,不需要官方内置通用版本带来不必要的兼容性负担。

内容的提问来源于stack exchange,提问作者David Oganov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:54:02