目錄
- 布爾型別(bool)
- 字符型別(char)
- 字串
- 字面量
- 字串插值
- 字串插值內部作業原理
- 字串格式化
- 換行符
- 字串不可變
- System.Text.StringBuilder
- 總結
上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介紹了基本數值型別,本篇將介紹其他的一些型別: bool、char 和 string,
布爾型別(bool)
bool 關鍵字是 System.Boolean 的別名, 它用于宣告變數來存盤布林值:true 和 false,
可將布林值賦給 bool 變數, 也可以將計算結果為 bool 型別的運算式賦給 bool 變數,
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',所有鍵盤字符都可這樣輸入,包括字母、數字以及特殊符號,
有的字符不能直接插入源代碼,需進行特殊處理,首先輸入反斜杠(\)前綴,再跟隨一個特殊字符代碼,反斜杠和特殊字符代碼統稱為轉義序列(escape sequence),
例如,\n 代表換行符,而 \t 代表制表符,由于反斜杠標志轉義序列開始,所以要用 \\ 表示反斜杠字符,
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
下表列出了字串轉義序列:
| 轉義序列 | 字符名稱 | 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;示例:\x00E7、\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 是一種“不可變” 型別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/91568.html
標籤:C#
上一篇:C# 中的基本數值型別
下一篇:C# 中的堆疊和堆
