不是所有值类型都可以为空的原因是什么?

dev*_*ium 11 .net nullable

是否有任何惩罚,这样你只应在真正需要它时将它们设置为可空?

谢谢

Mar*_*ell 20

很多原因:

  • 历史:Nullable<T>直到.NET 2.0才存在,并且它不能破坏现有代码 - 特别是对于不同的装箱规则Nullable<T>
  • 含义:如果我想要一个int,我可能不希望它可以为空......我希望它是一个int,我不想要检查/处理空值
  • 空间:它为每个结构增加了额外的成本...特别是,想象一下byte[],现在考虑是否可以byte为空 - 大量的额外开销;*加上它会阻止你做blits等*
  • 表现:Nullable<T>增加了许多额外的惩罚; 特别是很多隐藏的电话.HasValue.Value/ .GetValueOrDefault(); 这尤其在"提升的操作符"中显示 - 即x + y变为类似于下面的东西,这会增加紧密循环等:

    (x.HasValue && y.HasValue) ? (x.GetValueOrDefault() + y.GetValueOrDefault()) : null

同样,x == y必须检查:

  • 如果两个都为null => true
  • 如果一个null => false
  • 否则使用==GetValueOrDefault()每一个

很多开销....


Guf*_*ffa 6

是的,有罚款.该Nullable<T>结构包含值以及确定值的空值的布尔标志.

虽然布尔值只有一个字节,但结构与偶数字边界对齐.一个int使用四个字节的内存,而是一个int?需要八个字节.