很多语言已经实现了这种语法模式,所以我们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,家住在北京市朝阳区
要注意的是需要用两次
{{索引}}
大括号将索引包含起来,因为一次是输出表达式,两次就转义成普通的占位符了,这点要注意!