C#/Net代码精简优化技巧(1)
在我們寫代碼的時候可以使用一些小的技巧來使代碼變得更加簡潔,易于維護和高效。下面介紹幾種在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)
總結
以上是生活随笔為你收集整理的C#/Net代码精简优化技巧(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面对想法简单客户的有效需求分析
- 下一篇: 两个小知识:C#如何设置开机启动时自动执