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