随着源代码生成的越来越多的应用,自然也遇到了越来越多开发上的坑,例如源代码的缩进是一个绕不过去的问题。如果源代码生成是人类可见的代码,我期望生成的代码最好是比较符合人类编写代码的规范。为了能让人类在阅读机器生成的代码的时候,不会想着拿刀砍那个编写代码生成代码的开发者,最好,或者说至少代码也应该有个缩进和换行吧。本文将安利大家通过 IndentedTextWriter 这个辅助类,用来辅助生成带缩进的内容

使用 IndentedTextWriter 辅助类核心的用途在于自动加上缩进,缩进的等级由代码设置,可以通过加等和减等控制缩进等级。缩进等级是文本排版的概念,约等于缩进多少个空格

在开始使用 IndentedTextWriter 之前,需要先引用命名空间

using System.CodeDom.Compiler;
using System.Text;

初始化 IndentedTextWriter 需要传入一个 TextWriter 对象,用来当成写入输出的内容。有趣的是 IndentedTextWriter 类型自己也是继承 TextWriter 的类型,也就是可以用 IndentedTextWriter 类型进行无限套娃

大家都知道,继承 TextWriter 的类型用的多的有 StringWriter 和 StreamWriter 这两个。其中 StringWriter 用于辅助写入 StringBuilder 对象,基本输出限制在内存里面。而 StreamWriter 则是输出到 Stream 里,至于这个 Stream 是文件还是网络,那就看你的心情了

作为例子,咱使用 StringWriter 作为 IndentedTextWriter 的输出。对 IndentedTextWriter 写入的内容,最终将会写入到 StringBuilder 里面,初始化的代码如下

var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
var indentedTextWriter = new IndentedTextWriter(stringWriter, " ");

在初始化 IndentedTextWriter 时,可选传入 tabString 参数,此参数表示用来表示缩进的字符串。例如缩进等级为 1 时,将在每个行之前写入 1 个传入的 tabString 参数字符串,如上文代码,就是写入一个空格。如果自己传入其他的参数,例如两个空格,那就表示一个缩进等级写入两个空格。如自己传入 - 就表示每个缩进传入的是 - 字符

通过 IndentedTextWriter.Indent 属性可以控制当前的缩进等级,例如以下代码设置缩进为 2 缩进等级

indentedTextWriter.Indent = 2;

试试在缩进前后写入内容,看看缩进对写入内容的影响

indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent = 2; indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello"); Console.WriteLine(stringBuilder.ToString());

输出内容如下

Hello
Hello
Hello
Hello

通过加等和减等控制缩进等级,可以比较好的实现花括号的缩进,如以下代码

var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
var indentedTextWriter = new IndentedTextWriter(stringWriter, " ");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent = 2; indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello"); indentedTextWriter.Indent += 2;
indentedTextWriter.WriteLine("{"); indentedTextWriter.Indent += 4;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello"); indentedTextWriter.Indent -= 2;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent -= 2; indentedTextWriter.WriteLine("}"); indentedTextWriter.Indent -= 2; Console.WriteLine(stringBuilder.ToString());

输出内容如下

Hello
Hello
Hello
Hello
{
Hello
Hello
Hello
}

由于 IndentedTextWriter 的构造函数可以让缩进采用除了空格之外的其他字符串内容,这就可以让大家更加开森,可以将 IndentedTextWriter 用来除代码之外的其他生成内容里

本文的代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin e54d3f45986ff8200d8601cd8dc0bedc81924d75

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin e54d3f45986ff8200d8601cd8dc0bedc81924d75

获取代码之后,进入 HoyebenawlerWegemnardicheba 文件夹

dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容的更多相关文章

  1. mybatis-generator自动生成代码时,只生成insert方法

    今天使用mybatis-generator自动生成代码时,发现只能生成insert方法, 以前所有的方法都是可以生成的,查看网上解决办法和检查数据库表结构后, 发现2种可以解决的办法: 1.修改myb ...

  2. mybatis generator自动生成代码时 只生成了insert 而没有其他的

    mybatis框架提供了非常好用的逆向工程插件,但是在使用过程中会有很多问题. 我在使用中就遇到了只生成insert和insertSeletive方法,而不生成其他根据primary key查询更新删 ...

  3. mybatis使用generator自己主动生成代码时的类型转换

    使用mybatis的generator自己主动生成代码,可是oracle数据库中number(6,2)总是自己主动转成BigDecimal.我想要转成的是float类型 这样就写了一个类型转换器,须要 ...

  4. 2016.7.12 eclispe使用mybatis generator生成代码时提示project E is not exist

    运行mybatis-generator之后,出现错误:project E is not exist   错误原因:使用了项目的绝对路径. http://bbs.csdn.net/topics/3914 ...

  5. MVC Code First 自动生成数据库时生成的表名会多了一个s

    如图:我的类文件都是不带s的

  6. PyCharm新建.py文件时自动带出指定内容

    如:给Pycharm加上头行  # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...

  7. java如何在eclipse编译时自动生成代码

    用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...

  8. 使用 T4 文本模板生成设计时代码

      使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...

  9. 使用mybatis-generator生成代码

    文档地址: ​http://mbg.cndocs.tk/index.html ​ 以下是一个简单的配置内容. 一.在maven配置文件中添加mybatis-generator插件 1 2 3 4 5 ...

  10. mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap--转

    转自:http://blog.csdn.net/tan3739/article/details/7555665 Exception in thread "main" Java.la ...

随机推荐

  1. 记录--啊?Vue是有三种路由模式的?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 众所周知,vue路由模式常见的有 history 和 hash 模式,但其实还有一种方式-abstract模式(了解一哈~) 别急,本文我 ...

  2. 如何打造一个花里胡哨的Github个人主页?

    1.介绍 2.使用 2.1.创建一个同名仓库 2.2.引用模板 2.3.为内容添加有趣模块 2.3.1.徽章badge 2.3.2.waka 时间展示 2.3.3.展示 GitHub stars 等信 ...

  3. GID:旷视提出全方位的检测模型知识蒸馏 | CVPR 2021

    论文提出的GID框架能够自动选择可辨别目标用于知识蒸馏,而且综合了feature-based.relation-based和response-based知识,全方位蒸馏,适用于不同的检测框架中.从实验 ...

  4. KingbaseES V8R6 几种不同的表复制方式

    前言 当数据库遇到未知问题,有时候无法入手分析,在非生产数据库或者征得客户同意获得特殊时间,需要重建表解决,下面提供了多种不同的复制表的方法,我们了解一下他们的差异. 测试 1.CREATE TABL ...

  5. KingbaseES V8R3 集群运维案例 --操作系统‘soft lockup’引起的failover切换

    案例说明: 在国产中标麒麟系统生产环境中,监控发现KingbaseES V8R3集群发生了failover的主备切换,客户需要给出分析报告,说明此次集群发生failover切换的原因,本次文档通过分析 ...

  6. Bochs调试指令

    Bochs   Bochs就像一台真机一样,处理器在加电之后,要开始取指令并执行指令. jmpf f000:e05b ;转移目标位置ROM-BIOS   如图在左侧显示了该指令所在的物理内存地址 0x ...

  7. 3. Vector Spaces and Subspaces

    3.1 Vector Spaces The space \(R^n\) consists of all colunm vectors \(v\) with n components. We can a ...

  8. nginx重新整理——————热部署和日志切割[三]

    前言 简单演示热部署和日志切割. 正文 什么是热部署了,我们前文也说过了一个编译后的nginx 二进制. 热部署就是无需停止现有的nginx,替换正在运行的nginx. 步骤: 复制nginx 二进制 ...

  9. maven 创建spring boot 需要的配置[一]

    前言 之所以写这个是因为现在官方推荐云创建: 所以标注一下maven project,创建后,如何导入spring boot. 正文 1.步骤一 在pom.xml 中加入: <dependenc ...

  10. css 你真的了解padding吗?

    前言 padding 简写属性在一个声明中设置所有内边距属性,实际上在使用过程中它对block元素和内联元素的处理是不一样的. 正文 对于block元素 如果宽度非auto那么容器会变大,如果容器宽度 ...