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

问题描述 投票:0回答:3

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

这是我试图用谷歌搜索的内容:

^ in string access c#

我没有得到任何相关结果。我应该用谷歌搜索其他东西吗?

c# string range substring indices
3个回答
11
投票

其他人是正确的,因为它只是语法糖,但有一些细微的差异。它们都调用“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  

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
投票

谷歌此时没有提供帮助的原因(除了 c# .0 在提出问题时是新的)是,因为它涉及一般数组访问而不是特定于字符串,幸运的是字符串是可索引和可迭代的,因此语法也有效。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges

© www.soinside.com 2019 - 2024. All rights reserved.