C# 8 获取字符串最后n个字符的方法

C# 8 way to get last n characters from a string

最近 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#。

这是我想要做的 google:

^ in string access c#

我没有得到任何相关结果。我应该 google 别的吗?

评论者在这方面做得很好,但我要在这里给出一个答案,这样问题才算得到解答。

没有区别。这只是语法糖。以下是 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);

其他人是正确的,因为它只是语法糖,但有一些细微的差别。他们都调用“子字符串”,但是帽子版本调用 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