C#.NET中的显式字符串对框架是否更有效?
在某些编程语言中,所有字符串都有一个@前缀,即var foo=@“这是一个测试”C#.NET中的显式字符串对框架是否更有效?,c#,.net,C#,.net,在某些编程语言中,所有字符串都有一个@前缀,即var foo=@“这是一个测试” 如果字符串没有@前缀,.NET framework是否需要做额外的工作?是否需要进行任何扫描?我很好奇我们是否应该在所有可能的字符串上使用@?使用逐字字符串的速度可能会更快,也可能不会更快,这是您甚至无法通过输入编译器精心编制的程序来衡量的。在任何情况下,这种处理都发生在编译时,这使得所有相关的工作都“空闲”。所以从这个角度来看,绝对没有支持或反对逐字字符串的论据 这样说,我看到开发工具把非逐字字符串看作本地化的候
如果字符串没有@前缀,.NET framework是否需要做额外的工作?是否需要进行任何扫描?我很好奇我们是否应该在所有可能的字符串上使用@?使用逐字字符串的速度可能会更快,也可能不会更快,这是您甚至无法通过输入编译器精心编制的程序来衡量的。在任何情况下,这种处理都发生在编译时,这使得所有相关的工作都“空闲”。所以从这个角度来看,绝对没有支持或反对逐字字符串的论据
这样说,我看到开发工具把非逐字字符串看作本地化的候选对象,在这种情况下,使用一个逐字串,在适当的情况下确实有一定的价值。
< P>从MSIL的观点看,没有区别。string test = @"\test1";
string test2 = "test2";
IL_0001: ldstr "\test1"
IL_0006: stloc.0
IL_0007: ldstr "test2"
IL_000C: stloc.1
我甚至不会说(微不足道的)额外工作。如果我没有弄错的话,它只是意味着lexer的另一部分使用字符串文本。由于lexer是典型的有限自动机,字符串的长度应该决定性能,而不是哪个标记匹配。@delnan:理论上,我想这两种类型的字符串应该是不同的标记,在这种情况下,lexer可能会有更多的
if(nextChar==something)
测试在非逐字的情况下进行。在那里谈论性能有点荒谬(特别是因为lex还有非字符串文字部分),但我不想在回答中使用“荒谬”。)我同意,但对表演进行疯狂的猜测是非常诱人的。无论如何,任何这样的猜测都必须对实现进行大量假设。因此,让我们把它放在“它可能会更快,也可能不会更快,你甚至无法用病理输入来测量它的速度”。@delnan:编辑了答案。谢谢你的意见!旁注:若并没有区别,那个么你们就不应该随意使用@,因为这将是毫无意义的视觉混乱。并没有区别,只是语法上的甜点。正如Jon所说,当它有助于避免大量逃逸或抑制恼人的Resharper的本地化警告时,使用它是有意义的。