fuguangchao 2019-10-21
编程语言
重磅出击,C# 8.0 正式发布,微软宣布将C# 8.0 作为NET Core 3.0版本的其中一部分正式启用,Visual Studio 2019 支持所有新功能。你需要知道的重要功能,可空的引用类型、异步流、范围和索引、接口成员的默认实现、递归模式、Switch表达式等等……
C# 8.0 adds the following features and enhancements to the C# language:
• Readonly members
• Default interface methods
• Pattern matching enhancements:
▪ Switch expressions
▪ Property patterns
▪ Tuple patterns
▪ Positional patterns
• Using declarations
• Static local functions
• Disposable ref structs
• Nullable reference types
• Asynchronous streams
……
C# 8.0新版本最强功能“可为空的引用类型”。Inside a nullable annotation context, any variable of a reference type is considered to be a nonnullable reference type. If you want to indicate that a variable may be null, you must append the type name with the ? to declare the variable as a nullable reference type. 在可为空的注释上下文中,引用类型的任何变量都被视为不可为空的引用类型。如果要指示变量可以为空,则必须将类型名附加到 ? 将变量声明为可为空的引用类型。 针对不可为空的引用类型,编译器使用流分析确保局部变量在声明时初始化为非空值。在构造期间必须初始化字段。如果变量不是通过调用任何可用的构造函数或初始值设定项设置的,编译器将生成警告。此外,不能为不可为空的引用类型分配可以为空的值。
Starting with C# 8.0, you can create and consume streams asynchronously. A method that returns an asynchronous stream has three properties: 返回异步流方法的三个属性,你需要了解下:
1. It's declared with the async modifier. 用异步修饰符声明。
2. It returns an IAsyncEnumerable<T>. 它返回一个IAsyncEnumerable<T>。
3. The method contains yield return statements to return successive elements in the asynchronous stream. 该方法包含yield return语句,用于返回异步流中的连续元素。
当枚举流的元素时,使用异步流需要在foreach关键字之前添加wait关键字。添加wait关键字需要枚举用异步修饰符声明的异步流并返回异步方法允许的类型方法。这意味着返回一个或多个任务< tresult >。它也可以是valuetask或valuetask。
方法既可以使用也可以生成异步流,这意味着它将返回iasyncenumerable。以下代码生成一个从0到19的序列,在生成每个数字之间等待100 ms:
public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()
{
for (int i = 0; i < 20; i++)
{
await Task.Delay(100);
yield return i;
}
}
你可以使用wait foreach语句枚举序列:
await foreach (var number in GenerateSequence())
{
Console.WriteLine(number);
}
You can apply the readonly modifier to any member of a struct. It indicates that the member does not modify state. It's more granular than applying the readonly modifier to a struct declaration. Consider the following mutable struct: 你可以将readonly修饰符应用于结构的任何成员。它表示成员不修改状态。考虑以下可变结构:
public struct Point
{
public double X { get; set; }
public double Y { get; set; }
public double Distance => Math.Sqrt(X * X + Y * Y);
public override string ToString() =>
$"({X}, {Y}) is {Distance} from the origin";
}
像大多数结构一样,tostring()方法不修改状态。你可以通过向tostring()的声明中添加readonly修饰符来指示:
public readonly override string ToString() =>
$"({X}, {Y}) is {Distance} from the origin";
前面的更改会生成编译器警告,因为tostring访问distance属性,该属性未标记为只读:
warning CS8656: Call to non-readonly member 'Point.Distance.get' from a 'readonly' member results in an implicit copy of 'this'
……
What's new in C# 8.0
更多功能详情见https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#readonly-members
C#是微软公司发布的一种面向对象的、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。知道么,C#与Java有着惊人的相似,像诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但又有明显的不同,像它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(像没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
C#是兼顾系统开发和应用开发的最佳实用语言,很有可能成为编程语言历史上第一个“全能”型语言。有人曾说C#将不可避免地崛起,成为Windows平台上的主角……作为高级别面向对象快速成型的开发语言,它因容易学习、面向组件、结构化、高效率,以及能在多种计算机平台上编译备受推崇。
那些将C#推向巅峰的强大功能:布尔条件、自动垃圾回收、标准库、组件版本、属性和事件、委托和事件管理、易于使用的泛型、索引器、条件编译、简单的多线程、LINQ和Lambda表达式、继承Windows……