![]() |
1
7
你说得对。你还没说你为什么在乎。为什么要避免这种情况?
我很好。
我会使用 逐字插入字符串 这会很好地解决你的问题。 看见 How do you use verbatim strings with interpolation? (因为这是你在问题中提到的链接,我不完全清楚你为什么要问这个问题,因为你已经阅读了一个建议好答案的页面。)
你可能早就说过了。
可以通过更改源来更改所有代码。
首先不要插补。使字符串成为资源,使类负责获取格式化的资源字符串,并在类的方法中隐藏如何格式化字符串的实现细节。 |
![]() |
2
3
编译器做什么? 让我们从这里开始:
为什么不简单地打开它?使用ILSpy、Reflector等工具非常容易。
代码中会发生的情况是,每一行都被编译为
更详细地,
从所有这些可以推断出编译器很容易优化它:如果我们有一个表达式
请注意,字符串是.NET中的对象,但它们是“特殊对象”。你可以从以下事实中看出这一点:
在IL(当然是释放模式)中,这将给出:
tl;博士: 因此,不管插值字符串的连接是否已经实现(它们还没有实现),我都很有信心编译器最终会处理这种情况。 JIT做什么? 下一个问题是:使用字符串的JIT编译器有多聪明?
所以,让我们考虑一下,我们将教编译器关于
编译器将简单地将连接编译为IL,这意味着IL将保存这一点的非常直接的实现。在这种情况下,循环展开可以说对程序的(运行时)性能有很多好处:它可以简单地展开循环,将字符串附加10次,从而生成一个简单的常量。 然而,将这些知识提供给JIT编译器会使其更加复杂,这意味着运行时将花费更多的时间进行JIT编译(找出优化),而执行(运行发出的汇编程序)的时间更少。剩下的问题是:会发生什么? 启动程序,在写线上放置一个断点,然后点击ctrl-alt-D,查看汇编程序。
tl;博士: 不,这不是优化的。 但我希望JIT也能优化它! 是的,我不太确定我是否同意这个观点。运行时性能和JIT编译所花费的时间之间存在平衡。请注意,如果你在一个严密的循环中做这样的事情,我会认为你是在自找麻烦。另一方面,如果这是一个常见的、琐碎的情况(如连接的常量),那么很容易进行优化,并且不会影响运行时。 换言之:可以说,您不希望JIT对其进行优化,假设这将花费太多时间。我相信我们可以相信微软会明智地做出这个决定。 此外,您应该意识到.NET中的字符串是经过高度优化的。我们都知道他们经常被使用,微软也是如此。如果你不是在写“非常愚蠢的代码”,那么这是一个非常合理的假设,即它的性能会很好(除非得到证明)。 选择?
使用资源。资源是处理多种语言的有用工具。如果这只是一个小型的、非专业的项目,我根本就不会费心。 或者,您可以使用常量字符串串联的事实:
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |