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

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 开发过程中 常见的 https 问题 - 避坑 做前端多年,发现有些问题需要重复解决很多次,浪费了不少时间,https 导致的问题就属于其 ...

  2. 记录--对于$off,Exclude 和 Extract的一点理解

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.typescript 高阶类型 Exclude 和 Extract Exclude<T, U> TypeScript 2. ...

  3. 《Effective Java》笔记

    2. 创建和销毁对象 1. 静态工厂方法替代构造器 优点: 名称清晰 每次调用不必new对象 可以返回原返回类型任意子类型对象 返回的对象可以随着调用而发生改变 返回的对象所属的类,在编写该静态工厂方 ...

  4. Postman模拟向Eureka注册服务

    1.官方地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations 2.自己搭建一个 Eureka服务运行起来. 3.打开Post ...

  5. C# AES CBC模式 加密和解密

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...

  6. (Nosql)列式存储是什么?

    首先nosql可以被理解为not only sql 泛指非关系型数据库,也就是说不仅仅是sql,所以它既包含了sql的一些东西,但是又和sql不同,并在其的基础上改变或者说扩展了一些东西. 提到nos ...

  7. #点分树 or LCT#洛谷 4115 Qtree4

    两次LCT的Access操作就可以求LCA啦 题目 给出一棵树,支持单点反色和查询全局最远白点 分析(点分树) 点分树的做法就是考虑点分树上的父亲把子树分成若干个部分, 那么所谓的白点直径可以把子树的 ...

  8. HarmonyOS数据管理与应用数据持久化(二)

    通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据,当需要存储的数据没有复杂的关系模型,比如存储商品名称及对应价格.员工工号及今日是否已出勤等,由于数据复杂度低,更容易兼容不同 ...

  9. 第一篇:Python入门基础

    主要内容 1.Python简介 2.变量 3.字符编码 4.用户交互 5.if 流程判断 6.while循环 7.for循环 一.Python简介 1.python的创始人为吉多·范罗苏姆(Guido ...

  10. 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这

    写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...