网站的后缀名怎么建设,WordPress注册邮件美化,中国建设官网信息查询,wordpress 二次开发 sso最近每天忙着跑很多地方#xff0c;回家就不想动了#xff0c;没什么心情写东西。今天有空#xff0c;稍微写一点。下文中#xff1a;关于C#语法特性的部分需要Visual Studio 2019支持。关于.NET Core的部分需要安装.NET 3.0 Preview4#xff0c;低版本或许也可以但我没实… 最近每天忙着跑很多地方回家就不想动了没什么心情写东西。今天有空稍微写一点。下文中关于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 enablestring a null;string? b null;var c a.Length;var d b.Length;var e b!.Length;#nullable disablestring? 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(IEnumerablestring lines){using var file new System.IO.StreamWriter(WriteLines2.txt);foreach (string line in lines){// If the line doesnt contain the word Second, write the line to the file. if (!line.Contains(Second)){file.WriteLine(line);}}// file is disposed here}等价于static void WriteLinesToFile(IEnumerablestring lines){using (var file new System.IO.StreamWriter(WriteLines2.txt)){foreach (string line in lines){// If the line doesnt 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)时可以少写一些代码。【ASP dot NET Core 3.0中的 gRPC 服务】.NET CORE使用gRPC服务需要用到两个Nuget包运行时Google.Protobuf支持套件Grpc.Tools对于客户端而言还需要 Grpc.Core 包的支持。Google.Protobuf 不必解释Grpc.Core 是一系列客户端要用到的API而 Grpc.Tools 的牛逼之处在于不用编译 *.proto 文件即可直接在C#中引用它……对于.NET Core 2.1 或 2.2而言使用 gPRC 服务还需要手写微量代码(XXX.BindService方法)而到了.NET CORE 3.0引用 Grpc.AspNetCore.Server 包后即可直接以惯常的配置方式(AddXXX)直接使用此服务。这里偷个懒直接用 Visual Studio 2019.NET CORE 3.0做示例。VS 2019中有 gRPC 服务器的模板选择后直接会创建一个现成的新手示例。我们一定会注意到 Startup 类中 ConfigureServices 方法的语句 services.AddGrpc() 。这个是惯例不用去管重点看 Configure 方法里的代码片段app.UseRouting();app.UseEndpoints(endpoints {endpoints.MapGrpcServiceGreeterService();}); 此处和 WCF 的思想类似将服务添加到路由终结点让客户端连接。然后可以看位于 Protos 文件夹下的 greet.proto 文件syntax proto3;package Greet;// The greeting service definition.service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the users name.message HelloRequest { string name 1;}// The response message containing the greetings.message HelloReply { string message 1;}一个最简单的rpc服务器。然后再看 Services 文件夹下的 GreeterService.cs 文件using System.Threading.Tasks;using Greet;using Grpc.Core;namespace GrpcService{public class GreeterService : Greeter.GreeterBase{public override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloReply{Message $Hello { context.Method} request.Name});}}}代码的实现思路很好理解。我们可以注意到我们能够直接导入 Greet 命名空间这是因为它已经被Grpc.Tools 生成到了项目下 obj 文件夹的项目缓存中。最后的一个重点在项目配置文件(*.csproj)中的 ItemGroup 节点: Protobuf IncludeProtos\greet.proto GrpcServicesServer GeneratorMSBuild:Compile /这就是在项目中引用proto文件的方法具体细节详见官方说明gRPC services with C# 。然后我们可以创建个客户端尝试与服务端通讯建立一个命令行程序引用 Google.Protobuf、Grpc.Tools以及 Grpc.Core 包同时在项目配置文件中的 ItemGroup 节点中加入一句话Protobuf Include..\GrpcService\Protos\greet.proto GrpcServicesClient / 我是在服务端项目同目录建立的客户端项目所以路径直接这么写就OK)然后我们可以直接写using System;using System.Threading.Tasks;using Greet;using Grpc.Core;namespace ConsoleApp1{class Program{static async Task Main(string[] args){var channel new Channel(localhost:50051, ChannelCredentials.Insecure);var client new Greeter.GreeterClient(channel);var reply await client.SayHelloAsync(new HelloRequest { Name GreeterClient });Console.WriteLine(Greeting: reply.Message);await channel.ShutdownAsync();Console.WriteLine(Press any key to exit...);Console.ReadKey();}}}创建频道——创建连接——发送请求——关闭频道简单易懂。我们着重看两点。其一是 await channel.ShutdownAsync();在程序退出前最好或者说必须关闭曾经创建过的频道。另一个就是我们会注意到此处代码中的Greeter 类所公开的接口完全是面向客户端的。而同理上面服务器中的 Greeter 类公开的接口则是面向服务器的这是受项目配置中 GrpcServicesClient|Server的影响非常智能化……原文地址https://zhuanlan.zhihu.com/p/63779162.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com