为什么字符串插值更喜欢重载方法string
代替IFormattable
?
想象一下如下:
static class Log {
static void Debug(string message);
static void Debug(IFormattable message);
static bool IsDebugEnabled { get; }
}
我有非常昂贵的物品ToString()
。以前,我做了以下操作:
if (Log.IsDebugEnabled) Log.Debug(string.Format("Message {0}", expensiveObject));
现在,我想在里面添加 IsDebugEnabled 逻辑Debug(IFormattable)
,并且仅在必要时对消息中的对象调用 ToString()。
Log.Debug($"Message {expensiveObject}");
然而,这称为Debug(string)
超载。
这是一个Roslyn 团队深思熟虑的决定 https://github.com/dotnet/roslyn/issues/46:
我们通常认为,库大多会使用不同的 API 名称来编写,用于执行不同操作的方法。因此,FormattableString 和 String 之间的重载解析差异并不重要,因此 string 可能会获胜。因此,我们应该坚持一个简单的原则:插值字符串就是字符串。故事结局。
链接中有更多关于此的讨论,但结果是他们希望您使用不同的方法名称。
一些库 API 确实希望消费者使用 FormattableString,因为它更安全或更快速。接受 string 的 API 和接受 FormattableString 的 API 实际上执行不同的操作,因此不应重载同一个名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)