我通常通过连接长字符串来包裹它们:
Log.Debug("I am a long string. So long that I must " +
"be on multiple lines to be feasible.");
这是非常有效的,因为编译器处理字符串文字的串联。我也认为这是处理这个问题的最干净的方法(此处权衡选项 https://stackoverflow.com/questions/1565847/declaring-a-looooong-single-line-string-in-c-sharp).
这种方法效果很好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
等效的,或者如果我可以使用另一种方法,该方法不会降低效率(由于不必要的串联),同时还能保持我的代码结构清晰(根据上面链接中提出的要点)。
这个程序:
var name = "Bobby Tables";
var age = 8;
String msg = $"I'm {name} and" +
$" I'm {age} years old";
编译就像您编写的一样:
var name = "Bobby Tables";
var age = 8;
String msg = String.Concat(String.Format("I'm {0} and", name),
String.Format(" I'm {0} years old", age));
你会看到摆脱它的困难Concat
- 编译器重写了我们的插值文字以使用索引格式化程序String.Format
期望,但每个字符串都必须从 0 开始对其参数进行编号。天真地连接它们会导致它们都插入name
。为了使其正确工作,必须在调用之间维护状态$
解析器,以便第二个字符串被重新格式化为" I'm {1} years old"
。或者,编译器可以尝试应用与字符串文字串联相同的分析。我认为这将是一个合法的优化,尽管字符串插值可能会产生副作用,但如果事实证明存在插值字符串连接改变程序行为的极端情况,我不会感到惊讶。这两种听起来都不可能,特别是考虑到已经存在检测字符串文字的类似条件的逻辑,但我可以明白为什么这个功能没有进入第一个版本。
我会以您认为最干净、最易读的方式编写代码,并且不会担心微观效率低下,除非它们被证明是一个问题。 “代码主要是为了人类理解”这句老话在这里成立。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)