文章目錄
- 1 空操作符(??)
- 2 使用As轉換類型
- 3 自動屬性
- 4 StopWatch類
- 5 使用TimeSpan的靜態方法
- 總結
在我們寫代碼的時候可以使用一些小的技巧來使代碼變得更加簡潔,易於維護和高效。下面介紹幾種在C#/Net中非常有用的一些編程技巧。
1 空操作符(??)
在程式中經常會遇到對字串或是對象判斷null的操作,如果為null則給空值或是一個指定的值。通常我們會這樣來處理
string name = value;if (name == null){ name = string.Empty;}
可以使用三元操作符(?:)對上面對嗎進行最佳化
string name = value == null ? string.Empty : value;
這樣使代碼簡潔了不少,但這還不是最簡潔的,我們還可以使用??操作符來進行進一步最佳化,??操作符意思是如果為null取操作符左邊的值,否則取右邊的值。
string name = value ?? string.Empty;
我們甚至可以寫一個擴充方法來過濾掉null和空格,使返回的結果可以更好的使用??操作符
public static class StringUtility{ public static string TrimToNull(string source) { return string.IsNullOrWhiteSpace(source) ? null : source.Trim(); }}
使用代碼如下:
string name = string.TrimToNull(value) ?? "None Specified";
2 使用As轉換類型
在C#中進行類型轉換有很多種方式比如可以進行強制類型轉換,通常在轉換前會使用Is進行類型的判斷,所以您可能經常寫過或見過類似下面的代碼
if (employee is SalariedEmployee){ var salEmp = (SalariedEmployee)employee; pay = salEmp.WeeklySalary; // ...}
上面的代碼不會報異常,但在整個過程中做了兩次轉換操作,這樣會降低效能。我們可以使用as操作符來進行類型的轉換,同樣也不會報異常,如果類型不相容則返回null,而是用as進行轉換整個過程只轉換一次。代碼如下:
var salEmployee = employee as SalariedEmployee;if (salEmployee != null){ pay = salEmployee.WeeklySalary; // ...}
3 自動屬性
自動屬性是C#3.0以上版本中的新功能,可以使代碼變得更簡潔,在以前定義屬性我們會寫如下代碼
public class Point{ private int _x, _y; public int X { get { return _x; } set { _x = value; } } public int Y { get { return _y; } set { _y = value; } }}
使用自動屬性代碼就會簡潔了很多
public class Point{ public int X { get; set; } public int Y { get; set; }}
在自動屬性中,我們可以給get或set訪問器設定存取層級,使屬性變成唯讀屬性或是唯寫屬性
public class Asymetrical{ public string ThisIsReadOnly { get; private set; } public double ThisIsWriteOnly { private get; set; }}
4 StopWatch類
在程式開發中有時會需要統計一個方法或是一個預存程序執行了多長時間,比如在做一些方法的效能測試時就需要用到這用的時間統計功能,很自然想到的方法是在處理的方法前後各記錄一個時間,然後計算時間差,如下
DateTime start = DateTime.Now;SomeCodeToTime();DateTime end = DateTime.Now;Console.WriteLine("Method took {0} ms", (end - start).TotalMilliseconds);
儘管使用DateTime的時間差可以達到目的,但DateTime統計出來的時間差並不是很精確,想要精確我們可以使用Win32 API調用PInvoke,但是做法非常麻煩而且容易出錯。
這時我們就需要使用StopWatch類了,使用這個類必須引用命名空間 System.Diagnostics
var timer = Stopwatch.StartNew();SomeCodeToTime();timer.Stop();Console.WriteLine("Method took {0} ms", timer.ElapsedMilliseconds);
5 使用TimeSpan的靜態方法
當我們需要在程式中設定一個時間間隔或是等待多長時間後再做下一步操作時,往往會寫如下的代碼:
Thread.Sleep(50);
上面代碼中的參數50很明確是指50毫秒,這個是在定義方法的時候就定義好的類型,並不是很靈活,而且我們經常會使用int類型來定義傳入的參數,類型下面的代碼
void PerformRemoteWork(int timeout) { ... }
上面代碼中的timeout是指秒、毫秒還是小時或天,這個就需要開發人員自己去定義了,這樣的代碼在調用時就非常不明確,我們可以使用TimeSpan來解決這個問題
void PerformRemoteWork(TimeSpan timeout) { ... }
調用的代碼
PerformRemoteWork(new TimeSpan(0, 0, 0, 0, 50));
這樣的代碼也讓人看著很頭疼,因為TimeSpan有5個建構函式的重載,如下
TimeSpan();TimeSpan(long ticks);TimeSpan(int hours, int minutes, int seconds);TimeSpan(int days, int hours, int minutes, int seconds);TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);
由於這些重載在調用時很容易讓人混淆,而且寫出的代碼可讀性也不是很好,像上面的50如果不是很熟悉TimeSpan建構函式的並不能一眼就看出是50毫秒。更好的方法是使用TimeSpan的靜態方法
private static readonly TimeSpan _defaultTimeout=TimeSpan.FromSeconds(30);
上面的代碼的調用也可以寫成
PerformRemoteWork(TimeSpan.FromMilliseconds(50));
這樣無論是在寫程式時還是在閱讀代碼時都會感覺非常清楚明了。
總結
本文是參考一篇老外的部落格寫的,並不是直譯,原文見下面連結。這幾個小技巧並不是很複雜,但在實際編程中可以來來很大的好處。希望本文對大家有所協助。
原文連結:http://geekswithblogs.net/BlackRabbitCoder/archive/2010/08/26/c.net-five-little-wonders-that-make-code-better-1-of.aspx
C#/Net代碼精簡最佳化技巧(1)
C#/Net代碼精簡最佳化技巧(2)
C#/Net代碼精簡最佳化技巧(3)