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

使用readonly record struct作为方法out参数是否会引发装箱?

问题解答

问题描述

在性能敏感的数据流解析场景中,使用如下C#代码实现解析逻辑,请问代码中的message变量是否会发生装箱?

readonly record struct DataMessage(ulong Number, string Str, 
                                   ReadOnlySequence<byte> Payload);

bool TryParseMessage(ref ReadOnlySequence<byte> buffer, 
                     out DataMessage message) {
    message = default;
    ...
    message = new DataMessage(...);
    return true;
}

void PerformanceCriticalFunction() {
    ...
    while (TryParseMessage(..., out var message)) {
        // consume the message
        ...
    }
    ...
}

结论

不会发生装箱。

原因分析

  • DataMessage是readonly record struct,属于C#值类型范畴。值类型默认在栈上分配内存,只有当被转换为引用类型(如赋值给object变量、传递给接收object的方法、作为接口实例使用等)时才会触发装箱。
  • 代码中TryParseMessage的out参数直接操作栈上的DataMessage实例,while循环里的out var message也是在栈上创建值类型实例,整个消费过程没有任何将message转换为引用类型的操作,因此完全不会产生装箱开销,符合性能敏感场景的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:31:13