.NET Core 3.0起MidpointRounding是否属于用词不当?
关于
MidpointRounding枚举名称是否用词不当的分析 .NET 中的MidpointRounding枚举用于指定数值舍入模式,包含以下取值:
- AwayFromZero(.NET Core 1.0起可用)
- ToEven(.NET Core 1.0起可用)
- ToNegativeInfinity(.NET Core 3.0起可用)
- ToPositiveInfinity(.NET Core 3.0起可用)
- ToZero(.NET Core 3.0起可用)
这个枚举的设计有明显的演进痕迹:最初它只包含AwayFromZero和ToEven两个值,专门用于处理中点值的舍入逻辑(比如1.5这类刚好在两个整数中间的数值),这时候枚举名称MidpointRounding是完全贴切的。
但从.NET Core 3.0开始,微软新增了三个通用舍入模式,这些模式不仅能处理中点值,对非中点数值也生效——比如以下代码的输出就能证明:
for (decimal value = 1.0m; value <= 3.0m; value += 0.1m) { MidpointRounding[] roundings = Enum.GetValues<MidpointRounding>(); foreach (MidpointRounding rounding in roundings) { Console.WriteLine($"{value} {rounding} = {Math.Round(value, rounding)}"); } }
部分关键输出示例:
数值 舍入模式 = 舍入结果
1.1 ToPositiveInfinity = 2
1.9 ToNegativeInfinity = 1
从字面意义看,现在的MidpointRounding名称确实存在“名不符实”的问题,因为它的职责已经超出了“中点舍入”的范畴,变成了通用舍入模式的集合。但这并非设计失误,而是API演进中的兼容性妥协:如果为新增的通用舍入模式单独创建枚举,会导致现有依赖MidpointRounding的代码需要大量修改,成本极高。微软选择在原有枚举上扩展,是权衡兼容性和命名精确性后的结果。
所以结论是:从当前功能覆盖来看,枚举名称确实不够精准,但它是历史演进和兼容性需求下的合理选择,不能简单认定为“用词不当”。
内容的提问来源于stack exchange,提问作者Matthew Layton
相关产品推荐
相关产品推荐

