字符串的截取匹配操作在開發中非常常見,比如下面這個示例:我要匹配查找出來字符串數組中以“abc”開頭的字符串并打印,我下面分別用了兩種方式實現,代碼如下:
using System;namespace ConsoleApp23
{class Program{static void Main(string[] args){string[] strs = new string[] { "abc123" , "abc456" ,"ab123","a12345" };//方法1foreach (var str in strs){if (str.Substring(0, 3) == "abc"){Console.WriteLine(str);}}Console.WriteLine();//方法2 foreach (var str in strs){if (str.StartsWith("abc")){Console.WriteLine(str);}}Console.ReadKey();}}
}
運行結果如下:
誠然,兩種方法都輸出了正確的結果。
那么既然,兩種方式都能實現,這兩種方法有沒有什么區別呢?當然有的,而且大多數時候,一個老練的程序員都會用StartsWith而不是Substring,為什么呢?
往下看,我把數據源修改下:
static void Main(string[] args){string[] strs = new string[] { "abc123" , "abc456" ,"ab123","a12345" ,"abc","ab"};//方法1foreach (var str in strs){if (str.Substring(0, 3) == "abc"){Console.WriteLine(str);}}Console.WriteLine();//方法2 foreach (var str in strs){if (str.StartsWith("abc")){Console.WriteLine(str);}}Console.ReadKey();}
運行后,方法一直接崩了,但是方法2則可以正確運行出來結果
看一下Substring的用法解釋:startIndex 加 length 指示不在此實例內的位置。- 或 - startIndex 或 length 小于零。,所以當字符串小于你要截取的長度時,你如果沒用try catch去捕獲異常,代碼就崩潰了.
//// 摘要:// 從此實例檢索子字符串。子字符串從指定的字符位置開始且具有指定的長度。//// 參數:// startIndex:// 此實例中子字符串的起始字符位置(從零開始)。//// length:// 子字符串中的字符數。//// 返回結果:// 與此實例中在 length 處開頭、長度為 startIndex 的子字符串等效的一個字符串;如果 System.String.Empty 等于此實例的長度且// startIndex 為零,則為 length。//// 異常:// T:System.ArgumentOutOfRangeException:// startIndex 加 length 指示不在此實例內的位置。- 或 - startIndex 或 length 小于零。[SecuritySafeCritical]public String Substring(int startIndex, int length);
所以,我們需要慎用Substring,如果非要用,一定需要進行異常處理。