C# 中的 bool、char 和 string 類型

上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介紹了基本數值類型,本篇將介紹其餘的一些類型: boolcharstringexpress

布爾類型(bool

bool 關鍵字是 System.Boolean 的別名。 它用於聲明變量來存儲布爾值:truefalsec#

可將布爾值賦給 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 值。 在下面的示例中,使用相同的字符 Xchar 數組的四個元素進行初始化:操作系統

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# 的基本字符串類型是 stringstringSystem.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 類型在條件語句和表達式中表示。容許的值是 truefalse

char 類型表示值介於 0 到 65535 之間的 16 位無符號整數。char 類型的值對應於 Unicode 字符集。

零個或多個字符的有限序列稱爲字符串。容許使用逐字前綴 @ 指明轉義序列不被處理,容許用 $ 前綴進行字符串插值。 最後, string 是一種「不可變」 類型。

相關文章
相關標籤/搜索