一文帶你深入了解C#中的特殊字符
一、概述
特殊字符是預(yù)定義的上下文字符,用于修飾最前面插入了此類字符的程序元素(文本字符串,標(biāo)識符或?qū)傩悦Q)。C#支持以下特殊字符:
- @:逐字字符串標(biāo)識符字符
- $: 內(nèi)插入字符串字符
二、$-- 字符串內(nèi)插
$
字符將字符串字面量標(biāo)識為內(nèi)插字符串。 內(nèi)插字符串是可能包含內(nèi)插表達式的字符串文本 。 將內(nèi)插字符串解析為結(jié)果字符串時,帶有內(nèi)插表達式的項會替換為表達式結(jié)果的字符串表示形式。
字符串內(nèi)插為格式化字符串提供了一種可讀性和便捷性更高的方式。它比字符串復(fù)合格式設(shè)置更容易。
public static void Main(string[] arg) { var name = "Mark"; var date = DateTime.Now; Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date); Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now."); }
從C#10開始,可以使用內(nèi)插字符串來初始化常量字符串。僅當(dāng)內(nèi)插字符串中的所有內(nèi)插表達式也是常量字符串時,才可以執(zhí)行此操作。
2.1 內(nèi)插字符串的結(jié)構(gòu)
若要將字符串標(biāo)識為內(nèi)插字符串,可在該字符串前面加上$
符號。字符串字面量開頭的$
和"
之間不能有任何空格。
具備內(nèi)插表達式的項的結(jié)構(gòu)如下所示:
{<interpolationExpression>[,<alignment>][:<formatString>]}
interpolationExpression
生成需要設(shè)置格式的結(jié)果的表達式。null
的字符串表示形式為String.Empty
。alignment
常數(shù)表達式,它的值定義表達式結(jié)果的字符串表示形式中的最小字符數(shù)。 如果值為正,則字符串表示形式為右對齊;如果值為負,則為左對齊。formatString
受表達式結(jié)果類型支持的格式字符串。
public static void Main(string[] arg) { Console.WriteLine($"|{"Left",-7}|{"Right",7}|"); const int FieldWidthRightAligned = 20; Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number"); Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F2} - display only three decimal digits"); }
從 C# 11 開始,可以在內(nèi)插表達式中使用換行符,以使表達式的代碼更具可讀性。
下面的示例展示了換行符如何提高涉及模式匹配的表達式的可讀性:
public static void Main(string[] arg) { var safetyScore = 80; string message = $"The usage policy for {safetyScore} is" + $" {safetyScore switch { > 90 => "Unlimited usage", > 80 => "General usage, with daily safety check", > 70 => "Issues must be addressed within 1 week", > 50 => "Issues must be addressed within 1 day", _ => "Issues must be addressed before continued use", }}"; Console.WriteLine(message); }
2.2 內(nèi)插原始字符串字面量
從C# 11開始,可以使用內(nèi)插原始字符串字面量。如以下示例所示:
int X=2; int Y=3; var pointMessage = $"""The point"{X},{Y}" is {Math.Sqrt(X*X+Y*Y):F3} from the origin"""; Console.WriteLine(pointMessage);
要在結(jié)果字符串嵌入{
和}
字符,請讓內(nèi)插原始字符串字面量以多個$
字符開頭。執(zhí)行此操作時,任何長度短$
字符數(shù)的{
和}
字符序列都會嵌入到結(jié)果字符串中。若要將任何內(nèi)插表達式包含該字符串中,需要使用與$
字符數(shù)相同的大括號數(shù)。
如以下示例所示:
int X = 2; int Y = 3; var pointMessage = $$"""{The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y):F3}} from the origin}"""; Console.WriteLine(pointMessage);
內(nèi)插原始字符串字面量以兩個$
字符開頭。需要將每個內(nèi)插表達式放在雙大括號{{
和}}
之間。單個大括號嵌入到結(jié)果字符串中,如果需要重復(fù)的{
或}
字符嵌入結(jié)果字符串中,請使用相應(yīng)增加的$
字符數(shù)來指定內(nèi)插原始字符串字面量。
2.3 特殊字符
要在內(nèi)插字符串生成的文本中包含大括"{“或”}",請使用兩個大括號,即“{{”或“}}”。有關(guān)詳細信息。
因為冒號(“:”)在內(nèi)插表達式中具有特殊含義,為了在內(nèi)插表達式使用條件運算符,請將表達式放在括號內(nèi)。
下面示例演示了如何在結(jié)果字符串中包含大括號。下面示例演示如何使用條件運算符:
string name = "Horace"; int age = 34; Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{"); Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
內(nèi)插逐字字符串以$
和@
字符開頭??梢园慈我忭樞蚴褂?code>$和@:
$@"..."
和@$"..."
均為有效的內(nèi)插逐字字符串。
2.4 內(nèi)插字符串編譯
從C#10和.NET 6開始,編譯器會檢查內(nèi)插字符串是否被分配給滿足內(nèi)插字符串處理程序模式要求的類型。內(nèi)插字符串處理程序是一種內(nèi)插字符串轉(zhuǎn)換為結(jié)果字符串的類型。當(dāng)內(nèi)插字符串的類型為string時,它由System.Runtime.CompilerServices.DefaultInterpolatedStringHandle處理。
在C# 10之前,如果內(nèi)插字符串類型為String,則通常將其轉(zhuǎn)換為String.Format方法調(diào)用。如果分析的行為等同于串聯(lián),則編譯器可將String.Format替換為String.Concat。
如果內(nèi)插字符串類型為IFormattable或FormattableString,則編譯器會生成對FormattableStringFactory.Create方法的調(diào)用。
三、@-- 逐字字符串標(biāo)識符
@
特殊字符用作原義標(biāo)識符。通過以下方式使用它:
- 指示將原義解釋字符串。
@
字符在此實例中定義原義標(biāo)識符。簡單轉(zhuǎn)義序列、十六進制轉(zhuǎn)義序列和Unicode
轉(zhuǎn)義序列都將字面解釋。只有引號轉(zhuǎn)義序列(“”)不會被字面解釋;因為它生成一個雙引號。此外。如果是逐字內(nèi)插字符串,大括號轉(zhuǎn)義序列({{
和}}
)不按字面解釋;它們會生成單個大括號字符。
string filename1 = @"c:\documents\files\u0066.txt"; string filename2 = "c:\\documents\\files\\u0066.txt"; Console.WriteLine(filename1); Console.WriteLine(filename2);
- 使用C#關(guān)鍵字作為標(biāo)識符。
@
字符可作為代碼元素的前綴,編譯器將把此代碼元素解釋為標(biāo)識符而非C#關(guān)鍵字。
string[] @for={"John","James","Joan","Jamie"}; for(int ctr = 0; ctr<@for.Length;ctr++) { Console.WriteLine($"Here is your gift, {@for[ctr]}!"); }
使編譯器在命名沖突的情況下區(qū)分兩種屬性。屬性是派生自
Attribute
的類。其類型名稱通常包含后綴Attribute
,但編譯器不會強制進行轉(zhuǎn)換。
四、“”“–原始字符串文本
原始字符串字面量以至少三個雙引號(“
)字符開始和結(jié)束:
var singleLine = """This is a "raw string literal". It can contain characters like \, ' and ".""";
原始字符串字面量可以包含多行:
var xml = """ <element attr="content"> <body> </body> </element> """;
以下規(guī)則控制多行原始字符串字面量的解釋:
- 左引號和右引號字符必須位于各自的行中
- 右引號左側(cè)的任何空格將從原始字符串字面量的所有行中刪除。
- 將忽略同一行中左引號后面的空格。
- 字符串字面量中僅包含左引號后面的空格行
可能需要創(chuàng)建包含三個或更多連續(xù)雙引號字符的原始字符串字面量。 原始字符串字面量可以至少三個雙引號字符的序列開始和結(jié)束。 如果字符串字面量包含三個連續(xù)雙引號,則以四個雙引號字符開始和結(jié)束原始字符串字面量:
var moreQuotes = """" As you can see,"""Raw string literals""" can start and end with more than three double-quotes when needed."""";
原始字符串字面量還可以與內(nèi)插字符串結(jié)合使用,以在輸出字符串中嵌入{
和}
字符。在內(nèi)插的原始字符串字面量中使用多個$
字符,以在輸出字符串中嵌入{
和}
字符,而無需對這些字符進行轉(zhuǎn)義。
到此這篇關(guān)于一文帶你深入了解C#中的特殊字符的文章就介紹到這了,更多相關(guān)C#特殊字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用Oracle.ManagedDataAccess.dll組件連接Oracle數(shù)據(jù)庫
這篇文章介紹了C#使用Oracle.ManagedDataAccess.dll組件連接Oracle數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05C#中IList 與 List 的區(qū)別小結(jié)
IList 接口和 List 類是 C# 中用于集合操作的兩個重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-04-04WindowsForm實現(xiàn)TextBox占位符Placeholder提示功能
這篇文章主要介紹了WindowsForm實現(xiàn)TextBox占位符Placeholder提示,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07C#使用DevExpress中的SplashScreenManager控件實現(xiàn)啟動閃屏和等待信息窗口
這篇文章介紹了C#使用DevExpress中的SplashScreenManager控件實現(xiàn)啟動閃屏和等待信息窗口的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05Unity中的InitializeOnLoad特性實踐深入解析
這篇文章主要為大家介紹了Unity中的InitializeOnLoad特性實踐深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05