给ref struct赋值default与null字面量效果是否等效?
ref struct初始化:null与default是否等效?
先看这段代码:
ReadOnlySpan<char> span1 = null; ReadOnlySpan<char> span2 = default;
二者是否等效?
从编译结果和运行时行为来看,完全等效。
C#编译器对ref struct(比如ReadOnlySpan<T>)的null赋值做了特殊处理:它会把null直接解析为该ref struct的默认值,也就是和default(ReadOnlySpan<char>)完全一样的结果——一个不指向任何有效内存的空span实例。
隐藏细节与使用场景差异
虽然效果一致,但二者还是有值得注意的区别:
- 通用性不同:
default是通用的默认值表达式,适用于所有类型(值类型、引用类型、ref struct);而null只能用于引用类型、可空值类型,以及C# 7.2之后专门支持的ref struct(比如Span系列),普通值类型(如int)不能用null赋值,但default可以。 - 语义清晰度不同:
default的语义非常明确——取当前类型的默认值;而null原本是针对引用类型的"空引用"语义,用在ref struct上属于语法扩展,语义上不如default直观,容易让不熟悉ref struct特性的开发者产生误解。 - 代码风格一致性:如果项目中同时涉及多种类型的初始化,使用
default能保持风格统一,避免在不同类型间切换赋值方式。
内容的提问来源于stack exchange,提问作者Alexander Abakumov
相关产品推荐
相关产品推荐

