【C#6.0语法】模版字符串

很多语言已经实现了这种语法模式,所以我们C#也需要迎头赶上。

什么是模版字符串?还记得你们用过的格式化字符串吗?string.Format() 这个方法,是最常用的方法之一。下面是一个简单的例子:

var name = "张三";
var age = 24;
var address = "北京市朝阳区";
string.Format("我是{0},今年{1},家住在{2}", name, age, address);
//输出 我是张三,今年24,家住在北京市朝阳区

这样的好处是解决了拼字符串的性能问题,但又会带来一种问题,那就是长篇引起的索引问题。试想一下,如果在长篇字符串中定位索引,你是不是会吐血?比如:

string.Format(@"
--从Project表中加入项目数据
select * from (
    select ProjectName as orderCode,ProjectGUID,ProjectName,
        '--' AS '项目合计',
        '--' AS '以前年度合计',
        '--' AS '2011年合计',
        '--' AS '2011-01',
        '--' AS '2011-02',
        '--' AS '2011-03',
        '--' AS '2011-04',
        '--' AS '2011-05',
        '--' AS '2011-06',
        '--' AS '2011-07',
        '--' AS '2011-08',
        '--' AS '2011-09',
        '--' AS '2011-10',
        '--' AS '2011-11',
        '--' AS '2011-12',
        '--' AS '以后年度合计'
    from Project 
    where ProjectGUID={0}

----项目1    8FA659C8-3DA9-4330-B277-9B517E67606D    项目1    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --

    union all
--从产品表和Project表中加入合计行数据
    select Project.ProjectName+'.'+a.ProductCode as orderCode,a.ProductGUID,a.ProductName,
        '--' AS '项目合计',
        '--' AS '以前年度合计',
        '--' AS '2011年合计',
        '--' AS '2011-01',
        '--' AS '2011-02',
        '--' AS '2011-03',
        '--' AS '2011-04',
        '--' AS '2011-05',
        '--' AS '2011-06',
        '--' AS '2011-07',
        '--' AS '2011-08',
        '--' AS '2011-09',
        '--' AS '2011-10',
        '--' AS '2011-11',
        '--' AS '2011-12',
        '--' AS '以后年度合计'
    from #product a
    left join Project on a.ProjectGUID=Project.ProjectGUID

----项目1    8FA659C8-3DA9-4330-B277-9B517E67606D    项目1    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.00    00000000-0000-0000-0000-000000000000    合计    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.产品1    18908255-DB67-4EA3-A231-8BB39D5B748B    产品1    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.产品2    EDB216A9-EBB8-4F2C-AE4E-0A989EC7A993    产品2    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.产品3    7040241F-5A66-4F17-AACA-7CBE2FB3BCB9    产品3    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.产品4    108778CD-47C0-4258-9CB6-1FBE90CDEBDA    产品4    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --
----项目1.产品5    43F7B9BA-EF91-4A38-A048-090179F33C9B    产品5    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --    --

    union ALL

    --从产品表和Project表、#tempSaleDtl3中加入类型行数据
    select c.ProjectName+'.'+b.ProductCode+'.'+a.typecode as orderCode,a.ProductGUID, a.[type],
        cast(a.[项目合计] as varchar(20)),
        cast(a.[以前年度合计] as varchar(20)),
        cast(a.[2011年合计] as varchar(20)),
        cast(a.[2011-01] as varchar(20)),
        cast(a.[2011-02] as varchar(20)),
        cast(a.[2011-03] as varchar(20)),
        cast(a.[2011-04] as varchar(20)),
        cast(a.[2011-05] as varchar(20)),
        cast(a.[2011-06] as varchar(20)),
        cast(a.[2011-07] as varchar(20)),
        cast(a.[2011-08] as varchar(20)),
        cast(a.[2011-09] as varchar(20)),
        cast(a.[2011-10] as varchar(20)),
        cast(a.[2011-11] as varchar(20)),
        cast(a.[2011-12] as varchar(20)),
        cast(a.[以后年度合计] as varchar(20))
    from #tempSaleDtl3 a
    left join #product b on a.ProductGUID=b.ProductGUID
    left join Project c on b.ProjectGUID=c.ProjectGUID
) t1
order by {1}
", "ProjectName", "orderCode");

现在是写好了,但下一个需求让你加两个参数,你的索引位置又得变,还得在万码丛中查找你原来索引在哪里的,是不是很恶心??

模版字符串闪亮登场啦!

怎么用?在字符串的双引号前面加一个 $ 符号,在需要使用变量的地方用{变量}就可以了。

```cs
var name = "张三";
var age = 24;
var address = "北京市朝阳区";
$"我是{name},今年{age},家住在{address}";
//输出 我是张三,今年24,家住在北京市朝阳区

{变量}表示在字符串中输出变量的值,当然你也可以是一个表达式或者方法的执行。

$"我的生日是{GetBirth()}";

当然,调整顺序就显而易见啦,妈妈再也不用担心我把索引位置搞错啦!因为根本没有索引了,哈哈。

当然两者也可以被混用

var name = "张三";
var age = 24;
var address = "北京市朝阳区";
string.Format($"我是{name},今年{age},家住在{{0}}", address); 
//输出 我是张三,今年24,家住在北京市朝阳区

要注意的是需要用两次 {{索引}} 大括号将索引包含起来,因为一次是输出表达式,两次就转义成普通的占位符了,这点要注意!

你可能感兴趣的:(编程哲学)