C#8.0中有几个有趣的新功能和增强功能。 索引和范围是两个新添加项,分别作为新的System.Index和System.Range类型的一部分提供,用于索引和切片。 本文讨论了如何在C#8.0中使用索引和范围。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
[ 同样在InfoWorld上:如何将多个参数传递给Web API控制器方法
在Visual Studio 2019中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的.NET Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用此项目。
在Visual Studio中更新语言版本
为了能够在Visual Studio中使用C#8.0,应该像我们所做的那样使用针对.NET Core的项目。 您还需要更改项目中使用的语言的语言版本。 为此,请按照以下概述的步骤操作:
- 右键单击该项目。
- 选择“属性”以调用属性窗口。
- 单击构建->高级。
- 单击语言版本的下拉控件。
- 选择C#8.0作为语言版本。
- 单击确定。
System.Index和System.Range结构
C#8.0引入了两种新类型,即System.Index和System.Range。 您可以在运行时使用这些结构对集合进行索引或切片。 这是在System名称空间中定义System.Index结构的方式。
namespace System
{
public readonly struct Index
{
public Index(int value, bool fromEnd);
}
}
这是在System名称空间中定义System.Range结构的方式。
namespace System
{
public readonly struct Range
{
public Range(System.Index start, System.Index end);
public static Range StartAt(System.Index start);
public static Range EndAt(System.Index end);
public static Range All { get; }
}
}
[ 同样在InfoWorld上:何时在C#中使用抽象类和接口
在C#8.0中使用System.Index从头开始对集合进行索引
从C#8.0直到最后,C#都没有办法索引集合。 现在,可以通过使用一元运算符必须为System.Int32的一元^“ hat”运算符,来利用集合末尾的索引功能。
这是在C#8.0中如何定义来自最终运算符的预定义索引。
System.Index operator ^(int fromEnd);
让我们通过一个例子来理解这一点。 考虑以下字符串数组。
string[] cities = { "Kolkata", "Hyderabad", "Bangalore", "London", "Moscow", "London", "New York" };
下面的代码片段显示了如何利用^运算符来检索存储在数组中最后一个索引中的城市名称。
var city = cities[^1];
Console.WriteLine("The selected city is: " + city);
这是完整的程序供您参考。
using System;
namespace RangesAndIndexes
{
class Program
{
static void Main(string[] args)
{
string[] cities = { "Kolkata", "Hyderabad", "Bangalore",
"London", "Moscow", "London", "New York" };
var city = cities[^1];
Console.WriteLine("The selected city is: " + city);
Console.ReadKey();
}
}
}
执行程序时,输出应显示在控制台窗口中,如下图所示。
IDG
在C#8.0中使用System.Range提取序列的子集
使用数组和跨度类型时,可以利用System.Range提取序列的子集。 以下代码段说明了如何使用范围和索引显示字符串的最后六个字符。
string str = "Hello World!";
Console.WriteLine(str[^6..]);
当您执行程序时,输出“ World!” 应该出现在控制台窗口中,如下图所示。
IDG
这是另一个示例,说明切片的工作方式。
int[] integers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var slice = integers[1..5];
foreach (int i in slice)
Console.WriteLine(i);
当您执行上述程序时,数字1到4将显示在控制台窗口中。
您还可以在[..]括号内传递范围操作数,如下面的代码段所示。
string[] cities = { "Kolkata", "Hyderabad", "Bangalore", "London", "Moscow", "London", "New York" };
var data = cities[0..4];
foreach (var city in data)
{
Console.WriteLine(city);
}
执行程序时,存储在数组中的前四个城市名称将显示在控制台窗口中。
[ 也在InfoWorld上:2020年探索的5种Microsoft开发人员工具和技术
在C#8.0之前,没有任何语法有效的方法来访问C#中的范围或集合的切片。 现在,您有了两个新的语法糖-^(帽子)和'..'(范围)操作数,它们用于访问集合中的各个元素或范围,从而有助于使代码清晰,可读性和可维护性。