C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法
看Interpolated Strings之前,讓我們先看EF Core 2.0 的一個新的特性:String interpolation in FromSql and
ExecuteSqlCommand。
var city = "London"; using (var context = CreateContext()) { context.Customers .FromSql($@" SELECT * FROM Customers WHERE City = {city}") .ToArray(); }
SQL語句以參數(shù)化的方式執(zhí)行,所以是防字符串注入的。
@p0='London' (Size = 4000) SELECT * FROM Customers WHERE City = @p0
一直認為Interpolated Strings只是String.Format的語法糖,傳給FromSql的方法只是一個普通的字符串,已經(jīng)移除了花括號,并把變量替換成了對應(yīng)的值。FromSql獲取不到變量信息,怎么實現(xiàn)參數(shù)化查詢的呢? OK,讓我們從頭看起吧。
什么是內(nèi)插字符串 (Interpolated Strings)
內(nèi)插字符串是C# 6.0 引入的新的語法,它允許在字符串中插入表達式。
var name = "world"; Console.WriteLine($"hello {name}");
這種方式相對與之前的string.Format或者string.Concat更容易書寫,可讀性更高。就這點,已經(jīng)可以令大多數(shù)人滿意了。事實上,它不僅僅是一個簡單的字符串。
內(nèi)插字符串 (Interpolated Strings) 是什么?
用代碼來回答這個問題:
var name = "world"; string str1 = $"hello {name}"; //等于 var str1 = $"hello {name}"; IFormattable str2 = $"hello {name}"; FormattableString str3 = $"hello {name}";
可以看出,Interpolated Strings 可以隱式轉(zhuǎn)換為3種形式。實際上式編譯器默默的為我們做了轉(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 時代就有了,只有一個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能夠以參數(shù)化的方式來執(zhí)行SQL了。
EF Core 中的注意事項
因為隱式轉(zhuǎn)換的原因,在使用EF Core的FromSql 方法和 ExecuteSqlCommand方法時,需要特別小心。一不留神就會調(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(); }
第一種方法,因為sql的賦值被編譯成String.Format方法的調(diào)用,返回的是字符串。sql變量傳入FromSql方法時,又經(jīng)過一次System.String 到Microsoft.EntityFrameworkCore.RawSqlString隱式轉(zhuǎn)換。但sql變量本身已經(jīng)丟失了參數(shù)信息,所以無法實現(xiàn)參數(shù)化的查詢。
第四種方法, 也是Interpolated Strings -> String -> RawSqlString的轉(zhuǎn)換過程,但因為變量是分開傳入FromSql方法的,所以是以參數(shù)化的方式執(zhí)行的。
其他
熟悉ES2015的同學(xué)可以看看Javascript中的實現(xiàn),Tagged template literals,這和Interpolated Strings 非常類似。
昨晚凌晨12點發(fā)帖,不知道為什么被移除首頁了。感覺是篇幅不夠的原因,重新加了點EF Core注意事項,但超過1小時沒辦法重新回首頁了。七年來的第一篇文章,有點遺憾。希望大家喜歡。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:C#教程
本文標題:C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4997.html
您可能感興趣的文章
- 01-10C#實現(xiàn)實體類與字符串互相轉(zhuǎn)換的方法
- 01-10C#中Json字符串的各種應(yīng)用類實例講解
- 01-10VS中C#讀取app.config數(shù)據(jù)庫配置字符串的三種方法
- 01-10輕松學(xué)習(xí)C#的運算符
- 01-10輕松學(xué)習(xí)C#的String類
- 01-10C#找出字符串中第一個字母并大寫的方法
- 01-10C#解析json字符串總是多出雙引號的原因分析及解決辦法
- 01-10C#6.0中10大新特性的應(yīng)用和總結(jié)
- 01-10C#利用時間和隨即字符串創(chuàng)建唯一的訂單編號
- 01-10C#程序中session值的保存方法以及轉(zhuǎn)為字符串的方法總結(jié)


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?