C# 8 中获取字符串末尾 n 个字符的方法

9

最近 VS 提醒我使用:

var str = "foo";
var str2 = str[^2..];

不是使用:

var str = "foo";
var str2 = str.Substring(str.Length - 2);

所以,我的问题是str[^2..]str.Substring(str.Length - 2)之间有什么区别?我认为这是C#的新功能,但我找不到任何关于它的文档。所以,我不知道它被称为什么以及它随哪个版本的C#一起发布。
这就是我尝试谷歌的内容: ^在字符串访问c#中 我没有得到任何相关结果。我应该寻找其他内容吗?

4
当与字符串一起使用时,它会编译成.Substring,因此没有区别:只是更加整洁。对于其他类型,它会编译成不同的东西(通常为一个Slice方法)。在C# 8中引入 - canton7
1
这种 C# 的趋势让我感到害怕。 - Serg
1
@Rafalon,这确实有帮助。我应该删除还是更新我的问题以便对其他人有所帮助? - manymanymore
3个回答

7

其他人说得没错,它只是语法糖,但有些细微的差异。它们都调用“Substring”,但是带 ^ 符号的版本调用 String.Substring(Int32, Int32) 签名,而后面常规的版本则调用 String.Substring(Int32) 签名。

有趣的是,即使 str[^2..] 产生了更多的代码,在我的快速基准测试中它似乎具有稍微更好的性能。

var str = "foo";
var str2 = str[^2..];
========generates the following IL=============
   nop  
   ldstr    "foo"
   stloc.0     // str
   ldloc.0     // str
   dup  
   callvirt String.get_Length ()
   dup  
   ldc.i4.2 
   sub  
   stloc.2  
   ldloc.2  
   sub  
   stloc.3  
   ldloc.2  
   ldloc.3  
   callvirt String.Substring (Int32, Int32)
   stloc.1     // str2
   ldloc.1     // str2
   call Console.WriteLine (String)
   nop  
   ret

以下是传统版本。

var str = "foo";
var str2 = str.Substring(str.Length - 2);
========generates the following IL=============
   nop  
   ldstr    "foo"
   stloc.0     // str
   ldloc.0     // str
   ldloc.0     // str
   callvirt String.get_Length ()
   ldc.i4.2 
   sub  
   callvirt String.Substring (Int32)
   stloc.1     // str2
   ldloc.1     // str2
   call Console.WriteLine (String)
   nop  
   ret  

2
这两个差异是相互关联的。Substring(startIndex)调用Substring(startIndex, Length - startIndex)。因此,通过在已经确定了Length值的情况下让生成的代码完成这项工作,并直接调用后者,您可以避免不必要的传递调用(带有额外的Length属性访问),从而产生非常轻微的性能提升。 - StriplingWarrior
@StriplingWarrior - 明白了,谢谢你告诉我这个信息,并且讲解得非常清楚。你绝对掌握了这方面的知识! - SunsetQuest

3

评论者们做得很好,但我会在这里给出答案以便问题得到回答。

它们没有区别,只是语法糖。下面是LINQPad所显示的你将获得的"C# 1.0"术语:

   string str = "foo";
   int length = str.Length;
   int num = length - 2;
   int length2 = length - num;
   string str2 = str.Substring (num, length2);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接