欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中的char與string詳解

 更新時間:2022年01月21日 11:09:03   作者:癡者工良  
本文詳細講解了C#中的char與string,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. System.Char 字符

char 是 System.Char 的別名。

System.Char 占兩個字節(jié),16個二進制位。

System.Char 用來表示、存儲一個 Unicode 字符。

System.Char 的表示范圍是 U+0000 到U+FFFF,char 默認值是 \0,即 U+0000。

Unicode 的表示,通常以 U+____形式表示,即 U 和 一組16進制的數(shù)字組成。

char 有四種賦值方法

            char a = 'j';
            char b = '\u006A';
            char c = '\x006A';
            char d = (char) 106;
            Console.WriteLine($"{a} |  | {c} | vvxyksv9kd");

輸出

j | j | j | j

\u 開頭是 Unicode 轉義序列(編碼);使用 Unicode 轉義序列,后面必須是4個十六進制的數(shù)字。

\u006A    有效
\u06A	  無效
\u6A	  無效

\x 開頭是 十六進制轉義序列,也是由4個十六進制數(shù)字組成。如果前面是N個0的話,則可以省略0。下面的示例都是表示同一個字符。

\x006A
\x06A
\x6A

char 可以隱式轉為其他數(shù)值類型,整型有可以轉為ushortint,uintlong,和ulong,浮點型 可以轉為 floatdouble,和decimal。

char 可以顯式轉為 sbyte,byteshort。

其他類型無法隱式轉為 char 類型,但是任何整型和浮點型都可以顯式轉為 char。

2. 字符處理

System.Char 中,具有很多就態(tài)方法,能夠有助于識別、處理字符。

有一個非常重要的 UnicodeCategory 枚舉

  public enum UnicodeCategory
  {
    UppercaseLetter,
    LowercaseLetter,
    TitlecaseLetter,
    ModifierLetter,
    OtherLetter,
    NonSpacingMark,
    SpacingCombiningMark,
    EnclosingMark,
    DecimalDigitNumber,
    LetterNumber,
    OtherNumber,
    SpaceSeparator,
    LineSeparator,
    ParagraphSeparator,
    Control,
    Format,
    Surrogate,
    PrivateUse,
    ConnectorPunctuation,
    DashPunctuation,
    OpenPunctuation,
    ClosePunctuation,
    InitialQuotePunctuation,
    FinalQuotePunctuation,
    OtherPunctuation,
    MathSymbol,
    CurrencySymbol,
    ModifierSymbol,
    OtherSymbol,
    OtherNotAssigned,
  }

System.Char 中, 有一個 GetUnicodeCategory() 靜態(tài)方法,可以返回字符的類型,即上面的枚舉值。

除了 GetUnicodeCategory() ,我們還可以通過具體的靜態(tài)方法判斷字符的類別。

下面列出靜態(tài)方法的使用說明的枚舉類別。

靜態(tài)方法說明枚舉表示
IsControl值小于0x20 的不可打印字符。例如 \r、\n、\t、\0等。
IsDigit0-9和其他字母表中的數(shù)字DecimalDigitNumber
IsLetterA-Z、a-z 和其他字母字符UppercaseLetter,
LowercaseLetter,
TitlecaseLetter,
ModifierLetter,
OtherLetter
IsLetterOrDigit字母和數(shù)字參考 IsLetter 和 IsDigit
IsLower小寫字母LowercaseLetter
IsNumber數(shù)字、Unicode中的分數(shù)、羅馬數(shù)字DecimalDigitNumber,
LetterNumber,
OtherNumber
IsPunctuation西方和其他字母表中的標點符號ConnectorPunctuation,
DashPunctuation,
InitialQuotePunctuation,
FinalQuotePunctuation,
OtherPunctuation
IsSeparator空格和所有的 Unicode 分隔符SpaceSeparator,
ParagraphSeparator
IsSurrogate0x10000到0x10FFF之間的Unicode值Surrogate
IsSymbol大部分可打印字符MathSymbol,
ModifierSymbol,
OtherSymbol
IsUpper大小字母UppercaseLetter
IsWhiteSpace所有的分隔符以及 \t、\n、\r、\v、\fSpaceSeparator,
ParagraphSeparator

示例

        char chA = 'A';
        char ch1 = '1';
        string str = "test string"; 

        Console.WriteLine(chA.CompareTo('B'));          //-----------  Output: "-1
														//(meaning 'A' is 1 less than 'B')
        Console.WriteLine(chA.Equals('A'));             //-----------  Output: "True"
        Console.WriteLine(Char.GetNumericValue(ch1));   //-----------  Output: "1"
        Console.WriteLine(Char.IsControl('\t'));        //-----------  Output: "True"
        Console.WriteLine(Char.IsDigit(ch1));           //-----------  Output: "True"
        Console.WriteLine(Char.IsLetter(','));          //-----------  Output: "False"
        Console.WriteLine(Char.IsLower('u'));           //-----------  Output: "True"
        Console.WriteLine(Char.IsNumber(ch1));          //-----------  Output: "True"
        Console.WriteLine(Char.IsPunctuation('.'));     //-----------  Output: "True"
        Console.WriteLine(Char.IsSeparator(str, 4));    //-----------  Output: "True"
        Console.WriteLine(Char.IsSymbol('+'));          //-----------  Output: "True"
        Console.WriteLine(Char.IsWhiteSpace(str, 4));   //-----------  Output: "True"
        Console.WriteLine(Char.Parse("S"));             //-----------  Output: "S"
        Console.WriteLine(Char.ToLower('M'));           //-----------  Output: "m"
        Console.WriteLine('x'.ToString());              //-----------  Output: "x"
        Console.WriteLine(Char.IsSurrogate('\U00010F00'));		// Output: "False"
        char test = '\xDFFF';
        Console.WriteLine(test);						//-----------	Output:'?'
        Console.WriteLine( Char.GetUnicodeCategory(test));//-----------	Output:"Surrogate"

如果想滿足你的好奇心,可以點擊 http://www1.cs.columbia.edu/~lok/csharp/refdocs/System/types/Char.html

3. 全球化

C# 中 System.Char 有很豐富的方法去處理字符,例如常用的 ToUpper、ToLower 。

但是字符的處理,會受到用戶語言環(huán)境的影響。

使用 System.Char 中的方法處理字符時,可以調用帶有 Invariant 后綴的方法或使用 CultureInfo.InvariantCulture,以進行與語言環(huán)境無關的字符處理。

示例

            Console.WriteLine(Char.ToUpper('i',CultureInfo.InvariantCulture));
            Console.WriteLine(Char.ToUpperInvariant('i'));

對于字符和字符串處理,可能用到的重載參數(shù)和處理方式,請看下面的說明。

StringComparison

枚舉枚舉值說明
CurrentCulture0使用區(qū)分文化的排序規(guī)則和當前區(qū)域性來比較字符串
CurrentCultureIgnoreCase1使用對區(qū)域性敏感的排序規(guī)則,當前區(qū)域性來比較字符串,而忽略要比較的字符串的大小寫
InvariantCulture2使用區(qū)分文化的排序規(guī)則和不變區(qū)域性比較字符串
InvariantCultureIgnoreCase3使用區(qū)分區(qū)域性的排序規(guī)則,不變區(qū)域性來比較字符串,而忽略要比較的字符串的大小寫
Ordinal4使用序數(shù)(二進制)排序規(guī)則比較字符串
OrdinalIgnoreCase5使用序數(shù)(二進制)排序規(guī)則比較字符串,而忽略要比較的字符串的大小寫

CultureInfo

枚舉說明
CurrentCulture獲取表示當前線程使用的區(qū)域性的 CultureInfo對象
CurrentUICulture獲取或設置 CultureInfo對象,該對象表示資源管理器在運行時查找區(qū)域性特定資源時所用的當前用戶接口區(qū)域性
InstalledUICulture獲取表示操作系統(tǒng)中安裝的區(qū)域性的 CultureInfo
InvariantCulture獲取不依賴于區(qū)域性(固定)的 CultureInfo 對象
IsNeutralCulture獲取一個值,該值指示當前 CultureInfo 是否表示非特定區(qū)域性

4. System.String 字符串

4.1 字符串搜索

字符串有多個搜索方法:StartsWith()、EndsWith()Contains()、IndexOf。

StartsWith() 和 EndsWith() 可以使用 StringComparison 比較方式、CultureInfo 控制文化相關規(guī)則。

StartsWith() :字符串開頭是否存在符合區(qū)配字符串

EndsWith(): 字符串結尾是否存在符合區(qū)配字符串

Contains(): 字符串任意位置是否存在區(qū)配字符串

IndexOf: 字符串或字符首次出現(xiàn)的索引位置,如果返回值為 -1 則表示無區(qū)配結果。

使用示例

            string a = "癡者工良(高級程序員勸退師)";
            Console.WriteLine(a.StartsWith("高級"));
            Console.WriteLine(a.StartsWith("高級",StringComparison.CurrentCulture));
            Console.WriteLine(a.StartsWith("高級",true, CultureInfo.CurrentCulture));
            Console.WriteLine(a.StartsWith("癡者",StringComparison.CurrentCulture));
            Console.WriteLine(a.EndsWith("勸退師)",true, CultureInfo.CurrentCulture));
            Console.WriteLine(a.IndexOf("高級",StringComparison.CurrentCulture));

輸出

False
False
False
True
True
5

除了 Contains(),其它三種方法都有多個重載方法,例如

重載說明
(String)是否與指定字符串區(qū)配
(String, StringComparison)以何種方式指定字符串區(qū)配
(String, Boolean, CultureInfo)控制大小寫和文化規(guī)則指定字符串區(qū)配

這些與全球化和大小寫區(qū)配的規(guī)則,在后面章節(jié)中會說到。

4.2 字符串提取、插入、刪除、替換

4.2.1 提取

SubString() 方法可以在提取字符串指定索開始的N個長度或余下的所有的字符。

            string a = "癡者工良(高級程序員勸退師)";
            string a = "癡者工良(高級程序員勸退師)";
            Console.WriteLine(a.Substring(startIndex: 1, length: 3));
            // 者工良
            Console.WriteLine(a.Substring(startIndex: 5));
            // 高級程序員勸退師)

4.2.2 插入、刪除、替換

Insert() :指定索引位置后插入字符或字符串

Remove() :指定索引位置后插入字符或字符串

PadLeft() :在字符串左側將使用某個字符串擴展到N個字符長度

PadRight():在字符串右側將使用某個字符串擴展到N個字符長度

TrimStart() :從字符串左側開始刪除某個字符,碰到不符合條件的字符即停止。

TrimEnd() :從字符串右側開始刪除某個字符,碰到不符合條件的字符即停止。

Replace():將字符串中的N連續(xù)個字符組替換為新的M個字符組。

示例

            string a = "癡者工良(高級程序員勸退師)"; // length = 14

            Console.WriteLine("\n  -  Remove Insert   - \n");

            Console.WriteLine(a.Insert(startIndex: 4, value: "我是"));
            Console.WriteLine(a.Remove(startIndex: 5));
            Console.WriteLine(a.Remove(startIndex: 5, count: 3));

            Console.WriteLine("\n  -  PadLeft PadRight  -  \n");

            Console.WriteLine(a.PadLeft(totalWidth: 20, paddingChar: '*'));
            Console.WriteLine(a.PadRight(totalWidth: 20, paddingChar: '#'));
            Console.WriteLine(a.PadLeft(totalWidth: 20, paddingChar: '\u0023'));
            Console.WriteLine(a.PadRight(totalWidth: 20, paddingChar: '\u002a'));
            Console.WriteLine(a.PadLeft(totalWidth: 18, paddingChar: '.'));
            Console.WriteLine(a.PadRight(totalWidth: 18, paddingChar: '.'));

            Console.WriteLine("\n  -  Trim  -  \n");

            Console.WriteLine("|Hello | World|".Trim('|'));
            Console.WriteLine("|||Hello | World|||".Trim('|'));
            Console.WriteLine("|Hello | World!|".TrimStart('|'));
            Console.WriteLine("|||Hello | World!|||".TrimStart('|'));
            Console.WriteLine("|Hello | World!|".TrimEnd('|'));
            Console.WriteLine("|||Hello | World!|||".TrimEnd('|'));
            Console.WriteLine("||||||||||||||||||||||||".TrimEnd('|'));
            

            Console.WriteLine("*#&abc ABC&#*".TrimStart(new char[] {'*', '#', '&'}));
            Console.WriteLine("*#&abc ABC&#*".TrimStart(new char[] {'#', '*', '&'}));

            Console.WriteLine("\n  -  Replace  -  \n");

            Console.WriteLine("abcdABCDabcdABCD".Replace(oldChar: 'a', newChar: 'A'));

輸出

  -  Remove Insert   -

癡者工良我是(高級程序員勸退師)
癡者工良(
癡者工良(序員勸退師)

  -  PadLeft PadRight  -

******癡者工良(高級程序員勸退師)
癡者工良(高級程序員勸退師)######
######癡者工良(高級程序員勸退師)
癡者工良(高級程序員勸退師)******
....癡者工良(高級程序員勸退師)
癡者工良(高級程序員勸退師)....

  -  Trim  -

Hello | World
Hello | World
Hello | World!|
Hello | World!|||
|Hello | World!
|||Hello | World!

abc ABC&#*
abc ABC&#*

  -  Replace  -

AbcdABCDAbcdABCD

5. 字符串駐留池

以下為筆者個人總結,限于水平,如若有錯,望各位加以批評指正。

字符串 駐留池是在域(Domain)級別完成的,而字符串駐留池可以在域中的所有程序集之間共享。

CLR 中維護著一個叫做駐留池(Intern Pool)的表。

這個表記錄了所有在代碼中使用字面量聲明的字符串實例的引用。

拼接方式操作字面量時,新的字符串又會進入字符串駐留池。

只有使用使用字面量聲明的字符串實例,實例才會對字符串駐留池字符串引用。

而無論是字段屬性或者是方法內是聲明的 string 變量、甚至是方法參數(shù)的默認值,都會進入字符串駐留池。

例如

        static string test = "一個測試";

        static void Main(string[] args)
        {
            string a = "a";

            Console.WriteLine("test:" + test.GetHashCode());
            
            TestOne(test);
            TestTwo(test);
            TestThree("一個測試");
        }

        public static void TestOne(string a)
        {
            Console.WriteLine("----TestOne-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

        public static void TestTwo(string a = "一個測試")
        {
            Console.WriteLine("----TestTwo-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

        public static void TestThree(string a)
        {
            Console.WriteLine("----TestThree-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

輸出結果

test:-407145577
----TestOne-----
a:-407145577
b:-407145577
test - a :True
----TestTwo-----
a:-407145577
b:-407145577
test - a :True
----TestThree-----
a:-407145577
b:-407145577
test - a :True

可以通過靜態(tài)方法 Object.ReferenceEquals(s1, s2); 或者 實例的 .GetHashCode() 來對比兩個字符串是否為同一個引用。

可以使用不安全代碼,直接修改內存中的字符串

參考 https://blog.benoitblanchon.fr/modify-intern-pool/

string a = "Test";

fixed (char* p = a)
{
    p[1] = '3';
}

Console.WriteLine(a);

使用 *Microsoft.Diagnostics.Runtime* 可以獲取 CLR 的信息。

結果筆者查閱大量資料發(fā)現(xiàn),.NET 不提供 API 去查看字符串常量池里面的哈希表。

到此這篇關于C#中的char與string詳解的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論