麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

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

2019-10-29 19:41:19
字體:
來源:轉載
供稿:網友

看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語句以參數化的方式執行,所以是防字符串注入的。

@p0='London' (Size = 4000)SELECT *FROM CustomersWHERE 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); //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能夠以參數化的方式來執行SQL了。

EF Core 中的注意事項

因為隱式轉換的原因,在使用EF CoreFromSql 方法和 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方法的,所以是以參數化的方式執行的。

其他

熟悉ES2015的同學可以看看Javascript中的實現,Tagged template literals,這和Interpolated Strings 非常類似。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲一级电影在线观看 | 日韩黄色片免费看 | 日韩精品久久久 | 亚洲午夜一区二区三区 | 羞羞的视频免费在线观看 | 蜜桃麻豆视频 | 九九精品在线播放 | 13一14毛片免费看 | 成人aaaa免费全部观看 | 亚洲国产精久久久久久久 | 午夜视频在线免费观看 | 久久久一区二区三区视频 | 国产毛片aaa一区二区三区视频 | 一级免费黄色免费片 | 国产三级在线视频观看 | 激情久久免费视频 | 日韩毛片一区二区三区 | 亚洲一区二区三区在线免费观看 | 国产午夜精品久久久 | 亚洲第一精品在线 | 视频一区二区三区免费观看 | 日韩电影av在线 | 免费毛片视频 | 91天堂国产在线 | 欧美视频99 | 国产精品久久久久久久久粉嫩 | 日本黄色一级视频 | 国产91影院 | 99精品视频久久精品视频 | 亚洲第一视频在线 | aa级黄色片| 成人福利在线视频 | 成人国产高清 | 久久国产乱子伦精品 | 国产一区二区三区在线免费观看 | 欧美偷拍一区二区 | 国产精品一区二区视频 | 91精品国产777在线观看 | 欧美女孩videos | 亚洲视色 | 国产午夜精品久久久久 |