上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介紹了基本數值類型,本篇將介紹其餘的一些類型: bool
、char
和 string
。express
bool
)bool
關鍵字是 System.Boolean
的別名。 它用於聲明變量來存儲布爾值:true
和 false
。c#
可將布爾值賦給 bool
變量。 也能夠將計算結果爲 bool
類型的表達式賦給 bool
變量。api
public class BoolTest { static void Main() { bool b = true; // WriteLine automatically converts the value of b to text. Console.WriteLine(b); int days = DateTime.Now.DayOfYear; // Assign the result of a boolean expression to b. b = (days % 2 == 0); // Branch depending on whether b is true or false. if (b) { Console.WriteLine("days is an even number"); } else { Console.WriteLine("days is an odd number"); } } } /* Output: True days is an <even/odd> number */
雖然理論上一個二進制位足以容納一個布爾類型的值,但 bool
實際大小是一個字節。數組
char
)char
類型關鍵字是 System.Char
結構類型的別名,它表示 Unicode UTF-16
字符:性能
類型 | 範圍 | 大小 | .NET 類型 |
---|---|---|---|
char | U+0000 到 U+FFFF | 16 位 | System.Char |
輸入 char
字面量須要將字符放到一對單引號中,好比 'A'
。全部鍵盤字符均可這樣輸入,包括字母、數字以及特殊符號。ui
有的字符不能直接插入源代碼,需進行特殊處理。首先輸入反斜槓(\
)前綴,再跟隨一個特殊字符代碼。反斜槓和特殊字符代碼統稱爲轉義序列(escape sequence)。編碼
例如,\n
表明換行符,而 \t
表明製表符。因爲反斜槓標誌轉義序列開始,因此要用 \\
表示反斜槓字符。spa
Console.Write("\'"); //輸出單引號(') Console.Write("\\"); //輸出反斜槓(\)
char
類型字面量能夠輸入字符、十六進制轉義序列或 Unicode 表示形式。 也能夠將整型字面量強制轉換爲相應的 char
值。 在下面的示例中,使用相同的字符 X
對 char
數組的四個元素進行初始化:操作系統
var chars = new char[4]; chars[0] = 'X'; // Character literal chars[1] = '\x0058'; // Hexadecimal chars[2] = (char)88; // Cast from integral type chars[3] = '\u0058'; // Unicode Console.Write(string.Join(" ", chars)); // Output: X X X X
下表列出了字符串轉義序列:code
轉義序列 | 字符名稱 | Unicode 編碼 |
---|---|---|
\' |
單引號 | 0x0027 |
\" |
雙引號 | 0x0022 |
\\ |
反斜槓 | 0x005C |
\0 |
null | 0x0000 |
\a |
警報 | 0x0007 |
\b |
退格 | 0x0008 |
\f |
換頁 | 0x000C |
\n |
換行 | 0x000A |
\r |
回車 | 0x000D |
\t |
水平製表符 | 0x0009 |
\v |
垂直製表符 | 0x000B |
\u |
Unicode 轉義序列 (UTF-16) | \uHHHH(範圍:0000 - FFFF;示例:\u00E7 =「ç」) |
\U |
Unicode 轉義序列 (UTF-32) | \U00HHHHHH(範圍:000000 - 10FFFF;示例:\U0001F47D =「👽」) |
\x |
除長度可變外,Unicode 轉義序列與「\u」相似 | \xH[H][H][H](範圍:0 - FFFF;示例:\x00E七、\x0E7 或 \xE7 =「ç」) |
零個或多個 Unicode
字符的序列稱爲字符串,C# 的基本字符串類型是 string
,string
是 System.String
在 .NET 中的別名。
爲了將字面量字符串輸入代碼中,要將文本放入雙引號("
)內。字符串由字符構成,因此轉義序列可嵌入字符串內。
using System; namespace ConsoleApp { class Program { static void Main(string[] args) { Console.WriteLine("這是一個字符串"); Console.WriteLine("這裏使用\\n來換行\n這是第二行"); } } }
輸出
這是一個字符串 這裏使用\n來換行 這是第二行
C# 容許在字符串前使用 @
符號,指明轉義序列不被處理。結果是一個逐字字符串字面量(verbatim string literal),它不只將反斜槓看成普通字符,還會逐字解釋全部空白字符。
using System; namespace ConsoleApp { class Program { static void Main(string[] args) { Console.WriteLine(@"開始 /\ / \ / \ / \ -------- 結束"); } } }
輸出
開始 /\ / \ / \ / \ -------- 結束
從 C# 6 開始,可使用 $
特殊字符將字符串文本標識爲內插字符串。內插字符串是可能包含內插表達式的字符串文本。將內插字符串解析爲結果字符串時,帶有內插表達式的項會替換爲表達式結果的字符串表示形式。
using System; namespace ConsoleApp { class Program { static void Main(string[] args) { string name = "Mark"; var date = DateTime.Now; Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now."); } } }
輸出
Hello, Mark! Today is Monday, it's 10:33 now.
字符串插值是調用 string.Format()
方法的語法糖。例如如下語句:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
會被轉換成如下形式的 C# 代碼:
object[] args = { name, date, time }; Console.WriteLine(string.Format("Hello, {0}! Today is {1}, it's {2} now.", args));
不管使用 string.Format()
仍是 C# 6.0 字符串插值來構造複雜格式的字符串,均可經過一組覆蓋面廣和複雜的格式化模式來顯示數字、日期、時間、時間段等。例如,給定 decimal
類型的 price
變量,則 string.Format("{ 0,20:C2}",price)
或等價的插值字符串 $"{ price,20:C2}"
都使用默認的貨幣格式化規則將 decimal
值轉換成字符串。
即添加本地貨幣符號,小數點後四捨五入保留兩位,整個字符串在 20
個字符的寬度內右對齊(要左對齊就爲 20
添加負號。另外,寬度不夠只好超出)。
因篇幅有限,沒法詳細討論全部可能的格式字符串,請在 MSDN 文檔中查閱 string.Format()
獲取格式字符串的完整列表。
string.Format()
的連接地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.string.format?view=netcore-3.0
輸出換行所需的字符由操做系統決定。Microsoft Windows 的換行符是 \r
和 \n
這兩個字符的組合,UNIX 則是單個 \n
。 爲消除平臺之間的不一致,一個辦法是使用 System.Console.WriteLine()
自動輸出空行。
爲確保跨平臺兼容性,可用 System.Environment.NewLine
表明換行符。換言之,System.Console.WriteLine("Hello World")
和 System.Console.Write("Hello World"+ System.Environment.NewLine)
等價。
注意在 Windows 上,System.WriteLine()
和 System.Console.Write(System.Environment.NewLine)
等價於 System.Console.Write("\r\n")
而非 System.Console.Write("\n")
。
總之,要依賴 System.WriteLine()
和 System.Environment.NewLine
而不是 \n
來確保跨平臺兼容。
string
類型的一個關鍵特徵是它不可變(immutable)。可爲 string
變量賦一個全新的值,但出於性能考慮,沒有提供修改現有字符串內容的機制。
因此,不可能在同一個內存位置將字符串中的字母所有轉換爲大寫。只能在其餘內存位置新建字符串,讓它成爲舊字符串大寫字母版本,舊字符串在這個過程當中不會被修改,若是沒人引用它,會被垃圾回收。
public static void Main() { string text="abcdefg"; //UNEXPECTED: Does not convert text to uppercase text.ToUpper(); System.Console.WriteLine(text); }
輸出
abcdefg
從表面上看,text.ToUpper()
彷佛應該將 text
中的字符轉換成大寫。但因爲 string
類型不可變,因此 text.ToUpper()
不會進行這樣的修改。
相反,text.ToUpper()
會返回新字符串,它須要保存到變量中,或直接傳給 System.Console.WriteLine()
。
正確的字符串處理:
public static void Main() { string text="abcdefg"; // Return a new string in uppercase string uppercase = text.ToUpper(); System.Console.WriteLine(uppercase); }
輸出
ABCDEFG
System.Text.StringBuilder
若有大量字符串須要修改,好比要經歷多個步驟來構造一個長字符串,可考慮使用 System.Text.StringBuilder
類型而不是 string
。
StringBuilder
包含 Append()
、AppendFormat()
、Insert()
、Remove()
和 Replace()
等方法。雖然 string
也提供了其中一些方法,但二者關鍵的區別在於,在 StringBuilder
上,這些方法會修改 StringBuilder 自己中的數據,而不是返回新字符串。
bool
類型在條件語句和表達式中表示真或假。容許的值是 true
和 false
。
char
類型表示值介於 0 到 65535 之間的 16 位無符號整數。char
類型的值對應於 Unicode 字符集。
零個或多個字符的有限序列稱爲字符串。容許使用逐字前綴 @
指明轉義序列不被處理,容許用 $
前綴進行字符串插值。 最後, string
是一種「不可變」 類型。