本文是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 配置了 RollingFileAppenderColoredConsoleAppender 两个 Appender,前者可以在日志文件中额外记录下机器名称、进程的名称和 ID,后者确保在跨平台环境下日志依然“出彩”。
  • 整体的异常处理,针对 AggregateExceptionException 分别进行了捕捉和记录,并依此设置了 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#控制台应用模板的更多相关文章

  1. 40 个超棒的免费 Bootstrap HTML5 网站模板

    Bootstrap 是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等. 目前 ...

  2. 20 个免费的 Bootstrap 的后台管理模板

    之前 OSC 曾经发过多个后台管理界面模板的推荐,例如: 50 个漂亮的后台管理界面模板 25 个精美的后台管理界面模板和布局 分享 6 套超酷的后台管理员界面网站模板 30个优秀的后台管理界面设计案 ...

  3. 调研js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  4. js模板引擎介绍搜集

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  5. 拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 全盘下载地址列表!没有你找不到的!

    拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 网盘地址!没有你找不到的! 模板类型最齐全: ----------------------优美的走起!------------ 一:DE ...

  6. 基于Velocity开发自己的模板引擎

    Velocity是一个基于java的模板引擎(template engine).它同意不论什么人只简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloc ...

  7. 浅析js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  8. smarty模板开发基础总结

    前提:1. 部署smarty模板目录:2. 编写Smarty类的子类,定制好template_dir.compile_dir.config_dir.cache_dir.left_delimiter.r ...

  9. 12款程序员们最爱的Bootstrap模板

    如果你还没有开始使用Bootstrap模板,那你可真是有够OUT,这是一个帮助你快速开发的工具,Bootstrap是基于jQuery框架开发的,它在jQuery框架的基础上进行了更为个性化和人性化的完 ...

随机推荐

  1. Java线程的中断(Interruption)

    任务和线程的启动很容易.在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能安 ...

  2. 安装VirtualBox中的增强功能包VBoxLinuxAdditions

    首先,增强功能包VBoxLinuxAdditions有什么作用呢?请看: (1)实现客户机和主机间的鼠标切换. (2)与主机实现文件共享. (3)自动调整客户机分辨率. (4)与主机共享剪贴板的内容. ...

  3. 解决Kali用户名密码正确但是无法登陆的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=684 前言: 用户名和密码都正确,但是登陆Kali的时候总是提示用户名或密码错误,无法登陆,本文介绍一种解决办法. ...

  4. 第二章——机器学习项目完整案例(End-to-End Machine Learning Project)

    本章通过一个例子,介绍机器学习的整个流程. 2.1 使用真实数据集练手(Working with Real Data) 国外一些获取数据的网站: Popular open data repositor ...

  5. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

  6. [ Java面试题 ]泛型篇

    1.Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 好处: 1.类型安全,提供编译期间的类 ...

  7. ECMAScript 6 入门 ----Generator 函数

    本文转自:阮一峰老师的ECMAScript 6 入门,有时间可以看下评论! Generator 函数 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不 ...

  8. python类型转换convert实例分析

    在python的开发过程中,难免会遇到类型转换,这里给出常见的类型转换demo: 类型 说明 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 ...

  9. javascript进阶

    BOM操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <met ...

  10. Python爬虫进阶六之多进程的用法

    前言 在上一节中介绍了thread多线程库.python中的多线程其实并不是真正的多线程,并不能做到充分利用多核CPU资源. 如果想要充分利用,在python中大部分情况需要使用多进程,那么这个包就叫 ...