最近 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#
我没有得到任何相关结果。我应该用谷歌搜索其他东西吗?
其他人是正确的,因为它只是语法糖,但有一些细微的差异。它们都调用“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
评论者在这方面做得很好,但我会在这里给出答案,这样问题就可以被视为得到回答。
没有什么区别。这只是语法糖。以下是 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);
谷歌此时没有提供帮助的原因(除了 c# .0 在提出问题时是新的)是,因为它涉及一般数组访问而不是特定于字符串,幸运的是字符串是可索引和可迭代的,因此语法也有效。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges