C#8.0的两个有趣的新特性以及gRPC
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#8.0的两个有趣的新特性以及gRPC相关的知识,希望对你有一定的参考价值。
最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西。今天有空,稍微写一点。
下文中:
关于C#语法特性的部分需要Visual Studio 2019支持。
关于.NET Core的部分需要安装.NET 3.0 Preview4,低版本或许也可以但我没实验。
如果要在最新版的VS2019中使用.NET 3.0,可能需要在
选项
-解决方案与项目
-ASP.NET Core
中启用 使用.NET Core SDK
预览版 选项。
【C# 8.0新特性:可空的引用类型】
static void Main(string[] args)
{
#nullable enable
string a = null;
string? b = null;
var c = a.Length;
var d = b.Length;
var e = b!.Length;
#nullable disable
string? f = null;
}
复制以上简单的代码到IDE就能展现这个特性的特点与用法:
IDE会对
a
赋值为null
的操作进行警告, 因为在约定中a
不可为空,而b
则不会警告,因为它可以为null
;IDE会对
a.Length
的访问进行警告,因为已经静态推断出a
为null
了;IDE会对
b.Length
的访问进行警告,b
类型可能为空;b!.Length
的访问操作不会被警告,因为这种形式的访问表示老子已经知道它可能为null
了你闭嘴;string? f =null
语句会被IDE警告,因为上面已经把可为空的引用类型特性关闭了。
另外此特性不止支持 enable
和 disable
选项,还支持 restore
还原之前的设置,以及通过 safeonly
或 warnings
设置“定制”启用警告的范围,具体可参照其 详细说明 。
我们可以发现这个特性的的实质其实是一个“柔性”断言,启用后IDE会对部分代码进行警告提示,督促我们进行处理,但也止于此了。它非常灵活,新项目启用此特性是值得的,但旧项目也没必要升级。
【C# 8.0新特性:using 声明】
这里可以直接看官网的例子:
static void WriteLinesToFile(IEnumerable<string> lines)
{
using var file = new System.IO.StreamWriter("WriteLines2.txt");
foreach (string line in lines)
{
// If the line doesn't contain the word 'Second', write the line to the file.
if (!line.Contains("Second"))
{
file.WriteLine(line);
}
}
// file is disposed here
}
等价于:
static void WriteLinesToFile(IEnumerable<string> lines)
{
using (var file = new System.IO.StreamWriter("WriteLines2.txt"))
{
foreach (string line in lines)
{
// If the line doesn't contain the word 'Second', write the line to the file.
if (!line.Contains("Second"))
{
file.WriteLine(line);
}
}
} // file is disposed here
}
也就是说使用 using
关键字修饰的变量声明,它在作用域结束后会自动释放。一开始我没明白这个有什么意义,今天和 谈到某种情况,就是某些类型之所以会继承 IDispose
接口,可能是基于对语义或设计实现上的软需求,并非它一定需要调用 Dispose
方法才能够释放(比如 ProcessModule Class (System.Diagnostics) )。
在这种情况下,对于我这样的强迫症患者而言,明知道没必要,但也得不厌其烦地 try finally
或者 using{}
。有了这个特性,在写类似的代码的时候,可以只多加几个字就让心情舒畅,是强迫症患者的福音。另外在进行一些很常见的操作比如IO(Stream)、摘要计算(HashAlgorithm)时,可以少写一些代码。
以上是关于C#8.0的两个有趣的新特性以及gRPC的主要内容,如果未能解决你的问题,请参考以下文章