【问题标题】:C# 8 way to get last n characters from a stringC# 8 从字符串中获取最后 n 个字符的方法
【发布时间】:2021-07-22 15:21:37
【问题描述】:

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


【解决方案1】:

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

【讨论】:

  • 这两个差异是相互关联的。 Substring(startIndex) calls through to Substring(startIndex, Length - startIndex)。因此,通过在已经确定 Length 的值时让生成的代码完成这项工作,并直接调用后者,您可以避免不必要的直通调用(具有额外的 Length 属性访问),这会产生非常轻微的性能提升。
  • @StriplingWarrior - 明白了。感谢您填写我的信息……并且解释得很好。你肯定把这些东西记下来了!
【解决方案2】:

评论者在这方面做得很好,但我会在这里给出一个答案,这样这个问题就可以被认为是回答了。

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

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 2016-05-06
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多