【发布时间】:2015-11-26 01:35:53
【问题描述】:
我通常通过连接它们来包装长字符串:
Log.Debug("I am a long string. So long that I must " +
"be on multiple lines to be feasible.");
这是非常有效的,因为编译器处理字符串文字的连接。我也认为它是处理这个问题的最干净的方法 (the options are weighed here)。
这种方法适用于String.Format:
Log.Debug(String.Format("Must resize {0} x {1} image " +
"to {2} x {3} for reasons.", image.Width, image.Height,
resizedImage.Width, resizedImage.Height));
但是,我现在希望在这些情况下不再使用String.Format,因为 C# 6 的字符串插值更具可读性。 我担心的是,我不再有一种高效、干净的方式来格式化长字符串。
我的问题是编译器是否可以以某种方式优化类似
Log.Debug($"Must resize {image.Width} x {image.Height} image " +
$"to {resizedImage.Width} x {resizedImage.Height} for reasons.");
进入上述String.Format 等效项,或者如果我可以使用一种不会降低效率的替代方法(由于不必要的连接),同时还保持我的代码结构清晰(根据链接中提出的要点以上)。
【问题讨论】:
-
我看不出它与使用
String.Format有何不同 -
好吧,我确实在 LINQPad 中对其进行了测试,当使用 C# 6 的字符串插值时,它肯定会执行连接(显式使用
String.Format时不会发生这种情况)。我主要是希望可能有另一种方法,编译器选项等。 -
我很惊讶格式字符串不被视为编译时常量
-
您可以改用逐字插值字符串 (
$@"...") -
我认为整个“字符串是不可变的,不要连接它们”的智慧已经失控。与计算中的任何“规则”一样,这一规则也有很多例外。只有在尝试进行实时(或接近实时)处理时(由于 GC 的不可预测性,你可能不应该在 C# 中这样做)或者如果你正在做几十个(更现实地是数百个) 的串联。连接五个字符串会迷失在正在发生的所有其他事情的噪音中。我不会担心它并且在可读代码方面犯错。
标签: c# code-formatting