最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西。今天有空,稍微写一点。

下文中:

  • 关于C#语法特性的部分需要Visual Studio 2019支持。

  • 关于.NET Core的部分需要安装.NET 3.0 Preview4,低版本或许也可以但我没实验。

  • 如果要在最新版的VS2019中使用.NET 3.0,可能需要在 选项 - 解决方案与项目ASP.NET Core 中启用 使用 .NET Core SDK 预览版 选项。

【C# 8.0新特性:可空的引用类型】

static 

复制以上简单的代码到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 

等价于:

static 

也就是说使用 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

此处和 WCF 的思想类似,将服务添加到路由终结点,让客户端连接。

然后可以看位于 Protos 文件夹下的 greet.proto 文件:

syntax 

一个最简单的rpc服务器。

然后再看 Services 文件夹下的 GreeterService.cs 文件:

using 

代码的实现思路很好理解。我们可以注意到我们能够直接导入 Greet 命名空间,这是因为它已经被Grpc.Tools 生成到了项目下 obj 文件夹的项目缓存中。

最后的一个重点在项目配置文件(*.csproj)中的 ItemGroup 节点:

Include="Protos\greet.proto" GrpcServices="Server" Generator="MSBuild:Compile" />

这就是在项目中引用proto文件的方法,具体细节详见官方说明:gRPC services with C# 。

然后我们可以创建个客户端尝试与服务端通讯,建立一个命令行程序,引用 Google.Protobuf、Grpc.Tools以及 Grpc.Core 包,同时在项目配置文件中的 ItemGroup 节点中加入一句话:

Include="..\GrpcService\Protos\greet.proto" GrpcServices="Client" /> 

(我是在服务端项目同目录建立的客户端项目,所以路径直接这么写就OK)

然后我们可以直接写:

using 

创建频道——创建连接——发送请求——关闭频道,简单易懂。我们着重看两点。

其一是 await channel.ShutdownAsync();

在程序退出前,最好或者说必须关闭曾经创建过的频道。

另一个就是我们会注意到此处代码中的Greeter 类所公开的接口完全是面向客户端的。而同理,上面服务器中的 Greeter 类公开的接口则是面向服务器的,这是受项目配置中 GrpcServices=Client|Server的影响,非常智能化……

原文地址:https://zhuanlan.zhihu.com/p/63779162

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC相关推荐

  1. php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法

    php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...

  2. PHP如何删除一个路径下的所有文件夹和文件教程

    PHP如何删除一个路径下的所有文件夹和文件?等资源,欢迎您收藏本站,我们将为您提供最新的PHP如何删除一个路径下的所有文件夹和文件?资源 PHP如何删除一个路径下的所有文件夹和文件?下面本篇文章给大家 ...

  3. 删除某路径下所有空文件夹

    目的:删除某路径下所有空文件夹(包括其子文件夹) 原理:检测文件夹(及其子文件夹)下所有文件的大小,若为0,则删除该文件夹 输出:1.被删除的文件夹名 2.被删除文件夹数量(未计算子文件夹) '删除某 ...

  4. PHP删除一个路径下的所有文件夹和文件的方法

    用到的函数: scandir($path) 遍历一个文件夹所有文件并返回数组. unlink($filename) 删除文件. rmdir($path) 只删除空文件夹 代码: 删除单个文件 $fil ...

  5. 如何批量修改文件后缀名(包含该路径下的所有文件夹)

    1.批量修改某个文件夹目录下的所有文件的后缀名 方法非常简单,在该目录下,新建一个文本,此时文件后缀名是.txt.编辑该文本,文本内容为: ren *.ans *.out 此处的意思是将所有的.ans ...

  6. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...

    [本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 代码如下: import os import sys __all ...

  7. python判断空文件夹_python小技巧—自动判断并删除目录下的空文件夹

    一.效果展示 首先我在 E:\新建文件夹\test 创建了64个文件夹 然后我在1-10文件夹中创建一个新文件夹(此时他们就不是空文件夹了) 此时我们执行代码 如果此时目录就只剩下新建文件夹1-10 ...

  8. Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径、相对路径

    Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径.相对路径 目录 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 #Py ...

  9. asset文件夹路径 unity_Unity Assets目录下的特殊文件夹名称

    1.隐藏文件夹 以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中. 2.Standard Assets 在这个文件夹中的脚本最先被编 ...

最新文章

  1. Xilinx FIR IP core滤波器系数的重载方法
  2. 中国象棋人机博弈程序(扁平化棋局) C语言实现
  3. 北理工 管理系统计算机仿真作业,20秋北理工《CADCAM原理与应用》--模拟3-答案 更…...
  4. UWP 剪贴板 Clipboard
  5. opc服务器组态文件已写保护_「杰控软件」OPC代理服务,通过OPC方式采集远程OPC服务...
  6. Python 如何创建多维的list
  7. java转换字符集_Java字符集转换解释
  8. 开源的Linphone SIP 电话存在栈漏洞,可远程使客户端设备崩溃
  9. 个人空间html5主页面,2.HTML 教程- (HTML5 简介)
  10. C语言实现贪吃蛇小游戏
  11. 【数据结构】树(六)—— 二叉平衡树(C语言版)
  12. 阿里巴巴国际站业务如何写出高效便捷的客户开发跟进邮件?
  13. Linux的LILO引导程序,LILO引导装载器详解
  14. 飞秋与虚拟机的有关IP设置
  15. 百度BAE上能装什么pHp框架,百度Bae云平台安装dedecms图文教程
  16. FocalLoss解析
  17. 计算机专业浙大对比中科大,浙大,东南大学,中科大通信专业比较!!!!!!!!...
  18. 计算 signed short 的取值范围
  19. 操作系统--常见秋招、春招问题汇总(持续更新)
  20. Oracle报错1031,dataguard 归档日志报1031错误的一次处理

热门文章

  1. 代码版本管理 GitLab介绍
  2. windows2012运行linux,Linux一分钟部署完毕上线运行,windows server你要折磨我两天?...
  3. python和c++无缝对接_总结:Python学习 和 Python与C/C++交互
  4. php的添加语句怎么写,php修改语句怎么写
  5. 编译期java_java编译期和运行期
  6. BugkuCTF-MISC题隐写3
  7. BugkuCTF-Reverse题love
  8. linux服务器安装php7_CentOS 7 下 PHP 7.1.12 安装配置
  9. 32 位的有符号整数_leetcode 7 整数反转
  10. linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...