在 C# 6 中声明使用字符串插值的长字符串

2024-05-29

我通常通过连接长字符串来包裹它们:

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(使用前将#替换为@)

在 C# 6 中声明使用字符串插值的长字符串 的相关文章

随机推荐