扣丁学堂Java培训简述C#6.0内插字符串(Interpolated Strings )的使用方法

2019-07-26 15:38:10 2310浏览

本篇文章扣丁学堂Java培训小编给读者们分享一下C#6.0内插字符串(Interpolated Strings )的使用方法,对此感兴趣的小伙伴就随小编来了解一下吧,希望对小伙伴们有帮助。

扣丁学堂Java培训简述C#6.0内插字符串(Interpolated Strings )的使用方法


ExecuteSqlCommand


var city = "London";

using (var context = CreateContext())
{
 context.Customers
  .FromSql($@"
   SELECT *
   FROM Customers
   WHERE City = {city}")
  .ToArray();
}


SQL语句以参数化的方式执行,所以是防字符串注入的。


@p0='London' (Size = 4000)

SELECT *
FROM Customers
WHERE City = @p0


一直认为Interpolated Strings只是String.Format的语法糖,传给FromSql的方法只是一个普通的字符串,已经移除了花括号,并把变量替换成了对应的值。FromSql获取不到变量信息,怎么实现参数化查询的呢? OK,让我们从头看起吧。


什么是内插字符串 (Interpolated Strings)


内插字符串是C# 6.0 引入的新的语法,它允许在字符串中插入表达式。


var name = "world";
Console.WriteLine($"hello {name}");


这种方式相对与之前的string.Format或者string.Concat更容易书写,可读性更高。就这点,已经可以令大多数人满意了。事实上,它不仅仅是一个简单的字符串。


内插字符串 (Interpolated Strings) 是什么?


用代码来回答这个问题:


var name = "world";
string str1 = $"hello {name}"; //等于 var str1 = $"hello {name}";
IFormattable str2 = $"hello {name}";
FormattableString str3 = $"hello {name}";


可以看出,Interpolated Strings 可以隐式转换为3种形式。实际上式编译器默默的为我们做了转换:


var name = "world";
string str1 = string.Format("hello {0}",name); //等于 var str1 = $"hello {name}";
IFormattable str2 = FormattableStringFactory.Create("hello {0}",name);
FormattableString str3 = FormattableStringFactory.Create("hello {0}",name);


IFormattable 从.net Framwork 1 时代就有了,只有一个ToString方法,可以传入IFormatProvider来控制字符串的格式化。今天的主角不是他。

FormattableString 伴随Interpolated Strings引入的新类。



FormattableString 是什么?


先看一段代码


var name = "world";
FormattableString fmtString = $"hello {name}";
Console.WriteLine(fmtString.ArgumentCount); //1
Console.WriteLine(fmtString.Format); //hello {0}
foreach (var arg in fmtString.GetArguments())
{
 Console.WriteLine(arg); //world
 Console.WriteLine(arg.GetType()); //System.String
}


可以看出FormattableString保存了Interpolated Strings的所有信息,所以EF Core 2.0能够以参数化的方式来执行SQL了。


EF Core 中的注意事项


因为隐式转换的原因,在使用EF Core的FromSql 方法和 ExecuteSqlCommand方法时,需要特别小心。一不留神就会调入陷阱。


var city = "London";

using (var context = CreateContext())
{
 //方法一,非参数化
 var sql = $" SELECT * FROM Customers WHERE City = {city}";
 context.Customers.FromSql(sql).ToArray();

 //方法二,参数化
 context.Customers.FromSql($" SELECT * FROM Customers WHERE City = {city}").ToArray();

 //方法三,参数化
 FormattableString fsql = $" SELECT * FROM Customers WHERE City = {city}";
 context.Customers.FromSql(fsql).ToArray();

 //方法四,非参数化
 var sql = " SELECT * FROM Customers WHERE City = @p0";
 context.Customers.FromSql(sql, city).ToArray();

}


第一种方法,因为sql的赋值被编译成String.Format方法的调用,返回的是字符串。sql变量传入FromSql方法时,又经过一次System.String 到Microsoft.EntityFrameworkCore.RawSqlString隐式转换。但sql变量本身已经丢失了参数信息,所以无法实现参数化的查询。


第四种方法, 也是Interpolated Strings -> String -> RawSqlString的转换过程,但因为变量是分开传入FromSql方法的,所以是以参数化的方式执行的。


想要了解更多关于Java开发方面内容的小伙伴,请关注扣丁学堂Java培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的Java讲师为您指导,此外扣丁学堂老师精心推出的Java视频教程定能让你快速掌握Java从入门到精通开发实战技能。扣丁学堂Java技术交流群:850353792。


                        JavaEE/微服务/源码解析/分布式/企业级架构【VIP体验课】


     【关注微信公众号获取更多学习资料】       【扫码进入JavaEE/微服务VIP免费公开课】  



查看更多关于“Java开发资讯”的相关文章>>


标签: Java培训 Java视频教程 Java多线程 Java面试题 Java学习视频

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号