c# 路径下的最近文件夹_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
复制以上简单的代码到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相关推荐
- php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法
php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...
- PHP如何删除一个路径下的所有文件夹和文件教程
PHP如何删除一个路径下的所有文件夹和文件?等资源,欢迎您收藏本站,我们将为您提供最新的PHP如何删除一个路径下的所有文件夹和文件?资源 PHP如何删除一个路径下的所有文件夹和文件?下面本篇文章给大家 ...
- 删除某路径下所有空文件夹
目的:删除某路径下所有空文件夹(包括其子文件夹) 原理:检测文件夹(及其子文件夹)下所有文件的大小,若为0,则删除该文件夹 输出:1.被删除的文件夹名 2.被删除文件夹数量(未计算子文件夹) '删除某 ...
- PHP删除一个路径下的所有文件夹和文件的方法
用到的函数: scandir($path) 遍历一个文件夹所有文件并返回数组. unlink($filename) 删除文件. rmdir($path) 只删除空文件夹 代码: 删除单个文件 $fil ...
- 如何批量修改文件后缀名(包含该路径下的所有文件夹)
1.批量修改某个文件夹目录下的所有文件的后缀名 方法非常简单,在该目录下,新建一个文本,此时文件后缀名是.txt.编辑该文本,文本内容为: ren *.ans *.out 此处的意思是将所有的.ans ...
- python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...
[本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 代码如下: import os import sys __all ...
- python判断空文件夹_python小技巧—自动判断并删除目录下的空文件夹
一.效果展示 首先我在 E:\新建文件夹\test 创建了64个文件夹 然后我在1-10文件夹中创建一个新文件夹(此时他们就不是空文件夹了) 此时我们执行代码 如果此时目录就只剩下新建文件夹1-10 ...
- Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径、相对路径
Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径.相对路径 目录 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 #Py ...
- asset文件夹路径 unity_Unity Assets目录下的特殊文件夹名称
1.隐藏文件夹 以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中. 2.Standard Assets 在这个文件夹中的脚本最先被编 ...
最新文章
- Xilinx FIR IP core滤波器系数的重载方法
- 中国象棋人机博弈程序(扁平化棋局) C语言实现
- 北理工 管理系统计算机仿真作业,20秋北理工《CADCAM原理与应用》--模拟3-答案 更…...
- UWP 剪贴板 Clipboard
- opc服务器组态文件已写保护_「杰控软件」OPC代理服务,通过OPC方式采集远程OPC服务...
- Python 如何创建多维的list
- java转换字符集_Java字符集转换解释
- 开源的Linphone SIP 电话存在栈漏洞,可远程使客户端设备崩溃
- 个人空间html5主页面,2.HTML 教程- (HTML5 简介)
- C语言实现贪吃蛇小游戏
- 【数据结构】树(六)—— 二叉平衡树(C语言版)
- 阿里巴巴国际站业务如何写出高效便捷的客户开发跟进邮件?
- Linux的LILO引导程序,LILO引导装载器详解
- 飞秋与虚拟机的有关IP设置
- 百度BAE上能装什么pHp框架,百度Bae云平台安装dedecms图文教程
- FocalLoss解析
- 计算机专业浙大对比中科大,浙大,东南大学,中科大通信专业比较!!!!!!!!...
- 计算 signed short 的取值范围
- 操作系统--常见秋招、春招问题汇总(持续更新)
- Oracle报错1031,dataguard 归档日志报1031错误的一次处理
热门文章
- 代码版本管理 GitLab介绍
- windows2012运行linux,Linux一分钟部署完毕上线运行,windows server你要折磨我两天?...
- python和c++无缝对接_总结:Python学习 和 Python与C/C++交互
- php的添加语句怎么写,php修改语句怎么写
- 编译期java_java编译期和运行期
- BugkuCTF-MISC题隐写3
- BugkuCTF-Reverse题love
- linux服务器安装php7_CentOS 7 下 PHP 7.1.12 安装配置
- 32 位的有符号整数_leetcode 7 整数反转
- linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...