欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年11月26日 09:06:10   作者:刀是什么樣的刀  
這篇文章主要為大家詳細介紹了C# 6.0 內(nèi)插字符串的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

看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 CoreFromSql 方法和 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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Unity?UGUI的GraphicRaycaster射線投射組件介紹使用

    Unity?UGUI的GraphicRaycaster射線投射組件介紹使用

    這篇文章主要為大家介紹了Unity?UGUI的GraphicRaycaster射線投射組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • C#枚舉中的位運算權(quán)限分配淺談

    C#枚舉中的位運算權(quán)限分配淺談

    本文介紹C#位運算的處理方法,第一步, 先建立一個枚舉表示所有的權(quán)限管理操作,接下來是權(quán)限的運算等。
    2013-05-05
  • DevExpress設(shè)置FocusedNode背景色的方法

    DevExpress設(shè)置FocusedNode背景色的方法

    這篇文章主要介紹了DevExpress設(shè)置FocusedNode背景色的方法,很實用的功能,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)的sqlserver操作類實例

    C#實現(xiàn)的sqlserver操作類實例

    這篇文章主要介紹了C#實現(xiàn)的sqlserver操作類,結(jié)合具體實例形式分析了C#針對sqlserver數(shù)據(jù)庫進行連接、查詢、更新、關(guān)閉等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#對文件/文件夾操作代碼匯總

    C#對文件/文件夾操作代碼匯總

    有關(guān)文件的操作的內(nèi)容非常多,不過幾乎都是從下面的這些基礎(chǔ)方法中演化出來的。比如對內(nèi)容的修改,不外乎就是加上點字符串操作或者流操作。還有其它一些特別的內(nèi)容,等在開發(fā)項目中具體遇到后再添加。
    2015-04-04
  • C#版免費離線人臉識別之虹軟ArcSoft?V3.0(推薦)

    C#版免費離線人臉識別之虹軟ArcSoft?V3.0(推薦)

    本文只是簡單介紹了如何使用虹軟的離線SDK,進行人臉識別的方法,并且是圖片的方式,本地離線識別最大的好處就是沒有延遲,識別結(jié)果立馬呈現(xiàn),對C#離線人臉識別虹軟相關(guān)知識感興趣的朋友一起看看吧
    2021-12-12
  • C#啟動進程的幾種常用方法

    C#啟動進程的幾種常用方法

    這篇文章主要介紹了C#啟動進程的幾種常用方法,實例分析了C#對系統(tǒng)進行的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • WinForm入門與基本控件使用詳解

    WinForm入門與基本控件使用詳解

    本文主要介紹了WinForm入門與基本控件使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#連接Oracle數(shù)據(jù)庫的方法

    C#連接Oracle數(shù)據(jù)庫的方法

    這篇文章主要介紹了C#連接Oracle數(shù)據(jù)庫的方法,實例分析了C#連接Oracle數(shù)據(jù)庫的方法與主要實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#基礎(chǔ)知識之base關(guān)鍵字介紹

    C#基礎(chǔ)知識之base關(guān)鍵字介紹

    本文主要介紹base關(guān)鍵字的使用方法,base關(guān)鍵字可以調(diào)用基類重寫的方法,可以調(diào)用基類的構(gòu)造方法,還可以在EntityFramework中使用,下面一一介紹。
    2016-04-04

最新評論