超好用的C#控制台应用模板
本文是Wei的公众号投稿文章:
默认模板之缺
在工作学习中,我们经常需要创建一些简单的控制台应用(Console App)去验证某个想法,或者作为小工具交付给其他同事。
通常我们的选择是 Visual Studio 自带的 Console App 模板,这个经典模板只有预设好的 csproj 文件和空荡荡的 Main
方法,偶尔还会附送一行 Console.WriteLine("Hello World!");
,除此之外没有任何附加功能。
代码看起来大概是这样——
using System;namespace ConsoleApp1{class Program{static void Main(string[] args){Console.WriteLine("Hello World!");}}}
面对这如同白纸一样的模板,如果我们需要捕捉一下异常、调用一下异步方法、记录一下log呢?勤奋的你一定存有一些常用的经典代码片段和配置文件吧,那就一一复制进来呗……折腾了十来分钟后,终于可以开始写代码了……
N天之后,又需要新写个控制台应用了,我们再次重复一遍上述过程。
安装模板插件
受到 HTML5 Boilerplate 的启发,Visual Studio Marketplace 上也出现了一款叫做 C# Console App Boilerplate 的插件,顾名思义,就是在默认 Console App 模板基础上添加常用特性以解决痒点。
可以从 Visual Studio Marketplace 上直接下载 vsix 文件安装:https://marketplace.visualstudio.com/items?itemName=vej.20181111
也可以在 Visual Studio 2017 的 Extensions and Updates 中输入 C# Console App Boilerplate 搜索并安装:
安装完成后,通过 Visual Studio 再次新建 Project 时,就可以在 Visual C# 分类下找到 Console App Boilerplate 的两个新模板。
模板便利特性
通过 Console App Boilerplate 模板新建 Project 后,我们可以看到编辑器窗口中默认打开的 Main.cs 文件——
我们可以直接运行样例代码,也可以将 Work
方法中样例代码替换成我们的业务逻辑。样例代码直接运行的效果如下——
同样是控制台应用,那么它和经典的 Console App 模板究竟有何不同呢?我们打开 Program.cs 文件便可知晓——
- 使用了 C# 7.1 中新引入的异步
Main
方法,用来放置业务逻辑的Work
方法同样是异步的。调用异步方法时,可以直接使用await
关键字,省去了我们之前在同步Main
方法中做同样操作时附加的.Wait()
甚至是.ConfigureAwait(false).GetAwaiter().GetResult()
的繁琐。 - 预设的 log4net 配置了 RollingFileAppender 和 ColoredConsoleAppender 两个 Appender,前者可以在日志文件中额外记录下机器名称、进程的名称和 ID,后者确保在跨平台环境下日志依然“出彩”。
- 整体的异常处理,针对
AggregateException
和Exception
分别进行了捕捉和记录,并依此设置了 Exit Code。 Stopwatch
测量整体的运行时间并在最后一行日志中输出。- 修改代码页以支持 UTF-8 字符正常显示,如果需要显示汉字,在非中文的 Windows 中还需要额外地将 cmd.exe 的默认字体设置为 MingLiU / 新细明体 或其他CJK字体。
此外,无论是 .NET Core 还是 .NET Framework 版本的 csproj 文件都采用了 MSBuild 15.0 新引入的 project SDK 格式。新的格式不仅更简单清爽,也带来了很多方便的特性,这里不再赘述。
相关需求解法
在模板的基础上,如果需要解析复杂的命令行参数,可以考虑引入 NuGet 包 CommandLine.Net 进行解析。它的使用方法非常简单,GitHub 项目的一页 README 便已阐述清楚,亦支持跨平台。
反之,如果仅仅想运行几行代码,又不愿等 Visual Studio 启动呢?可以用浏览器打开 .NET Fiddle 直接尝试,它不仅支持最新的 .NET Framework 4.7.2 版本,还可以选择 Roslyn 2.0,而且在 C# 之外支持 F# 和 VB.NET。
超好用的C#控制台应用模板的更多相关文章
- 40 个超棒的免费 Bootstrap HTML5 网站模板
Bootstrap 是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等. 目前 ...
- 20 个免费的 Bootstrap 的后台管理模板
之前 OSC 曾经发过多个后台管理界面模板的推荐,例如: 50 个漂亮的后台管理界面模板 25 个精美的后台管理界面模板和布局 分享 6 套超酷的后台管理员界面网站模板 30个优秀的后台管理界面设计案 ...
- 调研js模板引擎
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- js模板引擎介绍搜集
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- 拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 全盘下载地址列表!没有你找不到的!
拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 网盘地址!没有你找不到的! 模板类型最齐全: ----------------------优美的走起!------------ 一:DE ...
- 基于Velocity开发自己的模板引擎
Velocity是一个基于java的模板引擎(template engine).它同意不论什么人只简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloc ...
- 浅析js模板引擎
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- smarty模板开发基础总结
前提:1. 部署smarty模板目录:2. 编写Smarty类的子类,定制好template_dir.compile_dir.config_dir.cache_dir.left_delimiter.r ...
- 12款程序员们最爱的Bootstrap模板
如果你还没有开始使用Bootstrap模板,那你可真是有够OUT,这是一个帮助你快速开发的工具,Bootstrap是基于jQuery框架开发的,它在jQuery框架的基础上进行了更为个性化和人性化的完 ...
随机推荐
- python字符串操作实方法大合集
python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下: #1.去空格及特殊符号 s.st ...
- Flask开发微电影网站(二)
1.安装数据库连接依赖包 pip install flask-sqlalchemy 2.创建movie数据库 在CentOS虚拟机,进入MaridDB数据库提示符,创建movie数据库 create ...
- GMT与Etc/GMT地区信息的时区转换
GMT 地区信息的时区 在将来的版本中可能不再支持以下左面一列中的地区信息的时区.可能从 /usr/share/lib/zoneinfo 删除这些文件.左列中的地区信息的时区用右列中对等的时区来替换. ...
- Python 字典(Dictionary) has_key()方法
描述 Python 字典(Dictionary) has_key() 函数用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false. 语法 has_key()方法语法:dic ...
- testng生成自定义html报告
转自:https://blog.csdn.net/kdslkd/article/details/51198433 testng原生的或reportng的报告总有些不符合需要,尝试生成自定义测试报告,用 ...
- [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks
概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexN ...
- kv_storage.go
package storage //kv 存储引擎实现 import ( "github.com/cznic/kv" "io" ) //kv 存 ...
- dqname.go
package nsqd func getBackendName(topicName, channelName string) string { // backend names, for u ...
- lease.go
package ) type:]...) :]...) )*time.Second) ) go func() { select { case <-stop ...
- Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)
Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1. 代码层面. 2. 数 ...