溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[C#]系列文章——關于C#,你應該知道的2000件事情(001)

發布時間:2020-07-28 01:32:11 來源:網絡 閱讀:391 作者:ghcomeon 欄目:編程語言

 該系列文章從關于C#,你應該知道的2000件事情翻譯

1. 使用foreach語句遍歷字符串

可以使用foreach語句遍歷字符串中的每個字符,迭代變量是char類型。

string secret = "Kint is Keyser Soze";
StringBuilder sbObfuscate = new StringBuilder();
foreach (char c in secret)
    sbObfuscate.Append((char)(c + 3));
Console.WriteLine(sbObfuscate);


2. TryParse方法指示類型轉換操作是否成功

可以使用Parse方法將代表數字的字符串轉化為和它等效的數值類型。

string numberString = "108";
int number = int.Parse(numberString);

以上操作會實現轉換:"108" à 108。但是上述操作存在一個問題:如果字符串代表的不是相關的數值類型,或是代表的數字超過了要轉換類型的范圍,會產生FormatException或 OverflowException異常。

int n1 = int.Parse("3.4");//FormatException

可以通過使用TryParse的方法避免異常。如果轉換操作成功,則轉換值存儲在輸出參數中,TryParse返回true。如果轉換操作不成功,輸出參數不會寫入,TryParse的返回false,不會拋出異常。

int n1;
if (int.TryParse("3.4", out n1))
    Console.WriteLine("Parse worked--n1 contains number");
else
    Console.WriteLine("Can't parse");

3.字符串是不可變的

C#中,字符串(System.String Type)是不可變的,操作字符串的函數(方法)不會改變字符串的實例,實際上返回字符串的一個新的實例。例如,可以使用Replace方法替換字符串的一部分,可以將結果賦值給原始的那個字符串或是一個新的字符串。

  如果忘記了字符串是不可變的,可能會將Replace方法執行的結果賦值給其他的變量。而編譯器對此不會提醒或是警告。

string quote = "Go to Heaven for the climate, Hell for the company.";
Console.WriteLine(quote);
// Does NOT change quote.  Rather, it creates 
//a new string, which we don't store anywhere
quote.Replace("Hell", "Minnesota");
Console.WriteLine(quote);

在C#中,字符串創建以后就是不可變的,但是可以通過把對字符串的操作結果賦值給新的字符串變量來改變舊字符串的值。

string s1 = "AGORA";
s1 = s1.Replace('A', 'Z');   // Replace A's with Z's

在這種情況下,原來的字符串s1被銷毀,包含操作結果的字符串賦值給s1。在大部分的場合,字符串是不可變的并不影響什么,因為仍然可以通過將操作結果賦值給原來的字符串變量來改變字符串的值。

但是,在考慮對同一字符串重復相同的字符串的操作時的效率時,字符串是不可變的是非常關鍵的。使用字符串連接操作符(+)是非常方便的,但是效率不高,因為每次連接操作都會創建一個新的字符串對象。

string s1 = "";
for (int i = 0; i < 50000; i++)
    s1 = s1 + i.ToString();//+對象操作每次都會創建一個新的string
可以通過StringBuilder類的Append方法提高以上代碼的效率,Append方法避免在每次迭代中創建新的string對象。
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 50000; i++)
    sb.Append(i.ToString());
后者的效率至少是前者的30倍。

4.獲取包含代理編碼對(Surrogate Pairs)的字符串的長度

可以使用string.Length屬性來獲取字符串的長度(字符的個數),但是,注意,這只有在字符串的Unicode代碼點不大于U+FFFF時可以正常獲取,Unicode代碼點集合也稱為BMP(BasicMultilingual Plane)—基本多語言平面.

  而BMP之外的Unicode代碼點的代表是使用4字節代理編碼對的 UTF-16 ,而BMP的Unicode代碼點使用的是2字節.

  為了正確統計代碼點可能包含高于U+FFFF字符串的字符個數,可以使用StringInfo類(System.Globalization)

string simple = "abc";// 3 Latin (ASCII) characters
// 3 character string where one character is a surrogate pair
string containsSurrogatePair = "AC";
// Length=3 (correct)
Console.WriteLine(string.Format("Length 1 = {0}", simple.Length)); 
// Length=4 (not quite correct)
Console.WriteLine(string.Format("Length 2 = {0}", containsSurrogatePair.Length));
 
// Better, reports Length=3
StringInfo si = new StringInfo(containsSurrogatePair);
Console.WriteLine(string.Format("Length 3 = {0}", si.LengthInTextElements));

盡管如此,在大部分的時候,仍然可以使用string.Length獲取字符串的長度(字符個數),但是應該注意Length屬性返回組成字符串的char對象的個數,而這和實際上的Unicode字符個數不一樣的.

string simple = "abc";// 3 Latin (ASCII) characters
string other = "ā丁";// 2 other characters: U+0100, E+4E01
 
Console.WriteLine(string.Format("Length 1 = {0}", simple.Length));//3
Console.WriteLine(string.Format("Length 2 = {0}", other.Length));//2

5. 通過正則表達式在字符串中檢查有效字符

using System.Text.RegularExpressions;
public bool IsAlphabetic(string s)
{
    Regex r = new Regex(@"^[a-zA-Z]+$");//判斷字符串是否由字母組成
    //Regex r = new Regex(@"^[0-9]+$"");//判斷字符串是否由數組組成
    return r.IsMatch(s);
}

以上方法判斷字符串 s 是否由字母組成,注意一下幾點:

^  代表字符串的開始

[a..zA..Z] 小寫或大寫字母

+ 字符串的字符可以重復

$ 字符串的結束


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女