a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法

2019-10-29 19:41:19
字體:
供稿:網(wǎng)友

看Interpolated Strings之前,讓我們先看EF Core 2.0 的一個(gè)新的特性:String interpolation in FromSql and

ExecuteSqlCommand。

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

SQL語(yǔ)句以參數(shù)化的方式執(zhí)行,所以是防字符串注入的。

@p0='London' (Size = 4000)SELECT *FROM CustomersWHERE City = @p0

一直認(rèn)為Interpolated Strings只是String.Format的語(yǔ)法糖,傳給FromSql的方法只是一個(gè)普通的字符串,已經(jīng)移除了花括號(hào),并把變量替換成了對(duì)應(yīng)的值。FromSql獲取不到變量信息,怎么實(shí)現(xiàn)參數(shù)化查詢的呢? OK,讓我們從頭看起吧。

什么是內(nèi)插字符串 (Interpolated Strings)

內(nèi)插字符串是C# 6.0 引入的新的語(yǔ)法,它允許在字符串中插入表達(dá)式。

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

這種方式相對(duì)與之前的string.Format或者string.Concat更容易書寫,可讀性更高。就這點(diǎn),已經(jīng)可以令大多數(shù)人滿意了。事實(shí)上,它不僅僅是一個(gè)簡(jiǎn)單的字符串。

內(nèi)插字符串 (Interpolated Strings) 是什么?

用代碼來回答這個(gè)問題:

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

可以看出,Interpolated Strings 可以隱式轉(zhuǎn)換為3種形式。實(shí)際上式編譯器默默的為我們做了轉(zhuǎn)換:

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 時(shí)代就有了,只有一個(gè)ToString方法,可以傳入IFormatProvider來控制字符串的格式化。今天的主角不是他。
  • FormattableString 伴隨Interpolated Strings引入的新類。

FormattableString 是什么?

先看一段代碼

var name = "world";FormattableString fmtString = $"hello {name}";Console.WriteLine(fmtString.ArgumentCount); //1Console.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能夠以參數(shù)化的方式來執(zhí)行SQL了。

EF Core 中的注意事項(xiàng)

因?yàn)殡[式轉(zhuǎn)換的原因,在使用EF CoreFromSql 方法和 ExecuteSqlCommand方法時(shí),需要特別小心。一不留神就會(huì)調(diào)入陷阱。

var city = "London";using (var context = CreateContext()){ //方法一,非參數(shù)化 var sql = $" SELECT * FROM Customers WHERE City = {city}"; context.Customers.FromSql(sql).ToArray(); //方法二,參數(shù)化 context.Customers.FromSql($" SELECT * FROM Customers WHERE City = {city}").ToArray(); //方法三,參數(shù)化 FormattableString fsql = $" SELECT * FROM Customers WHERE City = {city}"; context.Customers.FromSql(fsql).ToArray(); //方法四,非參數(shù)化 var sql = " SELECT * FROM Customers WHERE City = @p0"; context.Customers.FromSql(sql, city).ToArray();}

第一種方法,因?yàn)閟ql的賦值被編譯成String.Format方法的調(diào)用,返回的是字符串。sql變量傳入FromSql方法時(shí),又經(jīng)過一次System.String Microsoft.EntityFrameworkCore.RawSqlString隱式轉(zhuǎn)換。但sql變量本身已經(jīng)丟失了參數(shù)信息,所以無法實(shí)現(xiàn)參數(shù)化的查詢。

第四種方法, 也是Interpolated Strings -> String -> RawSqlString的轉(zhuǎn)換過程,但因?yàn)樽兞渴欠珠_傳入FromSql方法的,所以是以參數(shù)化的方式執(zhí)行的。

其他

熟悉ES2015的同學(xué)可以看看Javascript中的實(shí)現(xiàn),Tagged template literals,這和Interpolated Strings 非常類似。

昨晚凌晨12點(diǎn)發(fā)帖,不知道為什么被移除首頁(yè)了。感覺是篇幅不夠的原因,重新加了點(diǎn)EF Core注意事項(xiàng),但超過1小時(shí)沒辦法重新回首頁(yè)了。七年來的第一篇文章,有點(diǎn)遺憾。希望大家喜歡。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到c#教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中文字幕一区二区三区四区 | 欧美一级在线观看 | 毛片久久 | 国产精品国产三级国产aⅴ原创 | 在线观看中文视频 | 国产精品极品美女在线观看免费 | 国产精品女教师av久久 | 久久九九久久精品 | 九九在线精品 | 人人干人人干人人干 | av在线色| 国产野精品久久久久久久不卡 | sese久久| 欧美日韩一区二区在线观看 | 香蕉在线视频免费 | 国产福利一区二区三区四区 | 4虎tv| 色综合久久88色综合天天 | 国产中文在线 | 色综合国产 | 一级黄色录象片 | 亚洲精品入口a级 | 亚洲日本韩国在线观看 | 青娱乐网站 | 久久网日本 | 国产视频欧美视频 | 亚洲视频一区二区三区四区 | 色av一区| 最新国产中文字幕 | 一二三区不卡视频 | 欧美精品一区二区蜜臀亚洲 | 成人欧美在线 | 亚洲男人的天堂网站 | 激情小说综合网 | 成人av在线网 | 国产伦精品一区二区三区电影 | 日本不卡一区二区三区在线观看 | a天堂在线| 日韩欧美高清 | 欧美一区二区三区四区视频 | 青草成人免费视频 |