一、空操作符(??)
在程序中經常會遇到對字符串或是對象判斷null的操作,如果為null則給空值或是一個指定的值。通常我們會這樣來處理:
1、string name = value; if (name == null) { name = string.Empty; }
2、使用三元操作符(? :)對上面對嗎進行優化:
string name = value == null ? string.Empty : value;
上面的兩種方式 的代碼不夠簡潔,?? 操作符來進行進一步優化,?? 操作符意思是如果為null取操作符左邊的值,否則取右邊的值。
string name = value ?? string.Empty;
二、使用As轉換類型
在C#中進行類型轉換有很多種方式比如可以進行強制類型轉換,通常在轉換前會使用Is進行類型的判斷,所以您可能經常寫過或見過類似下面的代碼
if (obj is Employee) { var result = (Employee)obj; }
上面的代碼不會報異常,但在整個過程中做了兩次轉換操作,這樣會降低性能。我們可以使用as操作符來進行類型的轉換,同樣也不會報異常,如果類型不兼容則返回null,而是用as進行轉換整個過程只轉換一次。代碼如下:
var result = obj as Employee; if (result != null) { }
三、在自動屬性中,我們可以給get或set訪問器設置訪問級別,使屬性變成只讀屬性或是只寫屬性
public class PropertyTest { public string ThisIsReadOnlyProperty { get; private set; } public double ThisIsWriteOnlyProperty { private get; set; } }
四、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()
這兩個方法看名稱也可以知道IsNullOrEmpty是判斷空引用和空字符串,而IsNullOrWhiteSpace是判斷空引用和字符串中的每一個字符是否是空格。
需求:需要將三個名字連接在一起,並且希望中間名字不為空字符串和不出現多余的空格,我們會寫出下面的代碼:
public string FullName(string Name_1, string Name_2, string Name_3) { if (string Name_2 == null || mstring Name_2.Trim().Length == 0) { return string.Format("{0} {1}", Name_1, Name_3); } return string.Format("{0} {1} {2}", Name_1, Name_2, Name_3); }
上面的代碼中使用了Trim來去掉空格然后判斷其長度是否為0,代碼也非常的清晰簡潔,但是會產生額外的String對象以至於影響性能,這時就應該使用Net4.0中IsNullOrWhiteSpace方法(下面的代碼非常簡潔,而且也不用擔心會產生額外的String對象沒有及時的進行垃圾回收而影響性能。)
public string FullName(string Name_1, string Name_2, string Name_3) { if (string.IsNullOrWhiteSpace(Name_2)) { return string.Format("{0} {1}", Name_1, Name_3); } return string.Format("{0} {1} {2}", Name_1, Name_2, Name_3); }
五、string.Equals()
string.Equals方法有很多的重載供我們使用,但是其中有些常常會被我們忽視掉
public bool EqualsTest(string type) { if (type.Equals("1")) { } }
如果type為null會拋出NullReferenceException異常,所以為了不拋出異常,在判斷之前先要進行null的判斷,改寫成下面這樣
public bool EqualsTest(string type) { if (type !=null && type.Equals("1")) { } }
上面的解決辦法 相當於每次都要做兩次判斷,很麻煩而且有時還有可能遺忘,如果使用string.Equals就可以解決這個問題
public bool EqualsTest(string type) { if (string.Equals(type, "1")) //type為null時不會拋出異常而是直接返回false。 { } }
判斷字符串相等的時候有時會需要區分大小寫,很多人的習慣做法是先轉換成大小或是小些在進行比較(建議轉換成大寫,因為編譯器做了優化可以提高性能),但是當轉換成大寫或是小寫時又會創建的的字符串,使性能降低。這時應該使用StringComparison.InvariantCultureIgnoreCase,代碼如下
public bool EqualsTest(string type) { if ((string.Equals(type, "1",StrequityngComparison.InvariantCultureIgnoreCase))) { } }
六:System.IO.Path(當我們遇到這種需要對文件路徑進行操作時,我們可以去使用Path類的靜態方法)
Net中的System.IO.Path方法有很多的靜態方法來處理文件和路徑。很多時候我們嘗試手動的將路徑和文件名結合在一起而導致產生的文件路徑不可用,因為我們往往忽視了路徑后面可能有一個結尾符號‘\’。現在使用Path.Combine()方法可以避免這種錯誤
string fullPath = Path.Combine(workingDirectory, fileName);
假設現在有一個帶文件名的完整的路徑名,我們需要取其中的路徑、文件名或是文件的擴展名。Path類的很多靜態方法可以滿足我們的需要,如下
string fullPath = "D:\\Downloads\\output\\PathTest.html"; string pathPart = Path.GetPathRoot(fullPath);// 結果:D:\ string filePart = Path.GetFileName(fullPath);// 結果:PathTest.html string extPart = Path.GetExtension(fullPath);// 結果: .html string dirPart = Path.GetDirectoryName(fullPath);// 結果:"D:\downloads\output"