使用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
相关产品推荐
相关产品推荐

