2014年1月21日 星期二

C# - 善用程式特性的技巧

C#在程式上面,可以用運它的特性,讓程式寫法更有易讀性,效能更好。其實很程式語言,都有相同的特性,程式寫久了,就會了解最好的程式寫法。

下面這個是一般人字串的寫法:
string name = "";
這寫法易產生誤打空白而不自知,除錯時,反而會造成不容易找出問題而浪被不必要的除錯時間成本。另外,要講效能,當寫出實字 "" 時,會在記憶體空間紀錄上 "",雖然C#中,打在多相同的實字,實際上都會指向同一個地方。建議以下寫法,會減少誤打情況,描述性好:
string name = string.Empty;

用反組譯去看string.Empty會發現它是一個常數,也就是不管寫幾個,在記憶體中只會有一份,並且是運行期才會產生。
網路上有一篇文章在比較差異,實際上 "" 跟 string.Empty 根本沒有效能差異,但是描述性與不小心手滑就有差異了。
經常會要判別是否為空字串,用以下的程式:

string name = string.Empty;
if (name == string.Empty)
{
    //請輸入姓名
}
這樣的寫法有一個小危險,沒有判別是否為null,描述性沒有以下寫法好。
string name = string.Empty;
if (string.IsNullOrEmpty(name))
{
    //請輸入姓名
}
從控制項抓過來的值(大多控制項當沒有值時,會預設空字串),如果確定一定有初始值,
大多時候是要判別有值才執行陳述式
if ( ! string.IsNullOrEmpty(txtName.Text))
{
    //紀錄名稱
}
多一個 not ( ! ),也造成浪費了效能,描述性也差了一點,不易閱讀,因此可以這樣寫:
if (txtName.Text.Length > 0)
{
    //紀錄名稱
}

判斷式的運用對初學者來說,有時候會有無意義的區塊。不易閱讀
if (isTest == action)
{
    //執行測試
}
else
{
    //不執行測試
}

if是一個很玄的東西,它跟switch最大的不同的地方,switch是必然的,絛件只能有一個,但是if可以有很多的絛件。所以很多時候,使用不當時,常常會造成判斷上的誤解。
if (isTest == action)
{
    //執行測試
    return;
}
 //不執行測試

在這時候return會導致不知道何時才是結束時機,建議在最後才寫return。
那就至少要寫成以下的模式,反組譯微軟的code會發現,這是一種慣用手法,
目的在於未來的擴充,不必理會上面判斷式的長城,並且增加閱讀性。
if (isTest == action)
//執行測試
if(isTest != action)
 //不執行測試

 不過這樣的寫法,也要注意,因為它只執行下面程式的第一行,換句話說。下一行不管如何,都會執行到。

if (isTest == action) i = 0;
i = 1;

這樣的程式執行下來,i變數仍然會變成1。這是初學者要注意的使用地方。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言