C# 中的 bool、char 和 string 類型


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

布爾類型(bool

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

可將布爾值賦給 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 值。 在下面的示例中,使用相同的字符 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

下表列出了字符串轉義序列:

轉義序列 字符名稱 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# 的基本字符串類型是 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 是一種“不可變” 類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM