C 程式設計師最容易犯的7大錯誤

2022-07-18 03:51:11 字數 3576 閱讀 4802

程式設計時犯錯是必然的,即使是乙個很小的錯誤也可能會導致昂貴的代價,聰明的人善於從錯誤中汲取教訓,盡量不再重複犯錯,在這篇文章中,我將重點介紹c#開發人員最容易犯的7個錯誤。

格式化字串

在c#程式設計中,字串型別是最容易處理出錯的地方,其代價往往也很昂貴,在.net framework中,字串是乙個不可變的型別,當乙個字串被修改後,總是建立乙個新的副本,不會改變源字串,大多數開發人員總是喜歡使用下面這樣的方法格式化字串:

string updatequerytext= "update employeetable set name='" + name+ "' where empid=" + id;

上面的**太亂了,由於字串是不可變的,這裡它又使用了多重串聯,因此會在記憶體中建立三個不必要的字串垃圾副本。

最好的辦法是使用string.format,因為它內部使用的是可變的stringbuilder,也為淨化**鋪平了道路。

string updatequerytext= string.format("update employeetable set name='' where empid=", name, id);

•   巢狀異常處理

開發人員喜歡在方法的末尾加上異常處理的巢狀方法,如:

public class nestedexceptionhandling

catch (exception exception)

}private void childmethod1()

catch (exception exception)

}private void childmethod2()

catch (exception exception)}}

如果相同的異常被處理多次,上面的**會發生什麼?毫無疑問,效能開銷將會劇增。

解決辦法是讓異常處理方法獨立出來,如:

public class nestedexceptionhandling

catch(exception exception)

}private void childmethod1()

private void childmethod2()

}在大型資料集上使用foreach

大部分開發人員更喜歡使用foreach迴圈,而無視for迴圈,因為foreach更容易使用,但操作大型資料集時,使用foreach已經被證明是代價高昂的,在下面的**中,我同時使用for和foreach遍歷相同的資料庫,在圖1中顯示了兩種迴圈方法消耗的時間。

static void main(string args)

watch.stop();

console.writeline("time taken in for loop: ", watch.elapsed.totalseconds);

//foreachloop

watch.start();

foreach (datarow row in dt.rows)

watch.stop();

console.writeline("time taken in for each loop: ", watch.elapsed.totalseconds);

console.readkey();

}圖 1 for和foreach迴圈遍歷相同資料庫消耗的時間對比

從上圖可以看出,foreach迴圈明顯要慢一些,它消耗的時間幾乎是for迴圈的兩倍,這是因為foreach迴圈中的dt.rows要訪問資料庫中的所有行。因此需要遍歷大型資料集時最好使用for迴圈。

•      驗證簡單的原始資料型別

大多數開發人員都不知道內建的驗證原始資料型別的方法,如system.int32,因此很多人都是自己實現的,下面就是乙個自己實現的驗證乙個字串是否是數值的**:

public bool checkifnumeric(string value)

catch(formatexception exception)

returnisnumeric;

}它使用了try catch語句,因此不是最佳的做法,更好的辦法是象下面這樣使用int.tryparse:

int output= 0;

boolisnumeric = int.tryparse(value, out output);

根據我的經驗,int.tryparse是更快,更簡潔的方法。 

處理物件實現idisposable介面

在.net framework中,物件的處理和使用一樣重要,理想的辦法是在類中實現idisposable介面的dispose方法,在使用這個類的物件後,可以通過呼叫dispose方法進行處理。

下面的**顯示了乙個sqlconnection物件的建立,使用和處理:

public void dalmethod()

catch (exception exception)

finally

}在上面的方法中,連線處理在最後乙個**塊中被明確呼叫,如果發生乙個異常,catch**塊就會執行,然後再執行最後乙個**塊處理連線,因此在最後乙個**塊執行之前,連線將一直留在記憶體中,.net framework的乙個基本原則就是當物件不被使用時就應該釋放資源。

下面是呼叫dispose更好的辦法:

public void dalmethod()

}當你使用using**塊時,物件上的dispose方法將在執行退出**塊時呼叫,這樣可以保證sqlconnection的資源被處理和盡早釋放,你也應該注意到這個辦法也適用於實現idisposable介面的類。

•    宣告公共變數

聽起來可能有點簡單,但我們經常看到濫用公共變數宣告的情況,先來看乙個例子:

static void main(string args)

public class myaccount

}在上面的myaccount類中宣告了乙個accountnumber公共變數,理想情況下,accountnumber應該是唯讀的,但myaccount類卻沒有對它實施任何控制。

宣告公共變數正確的做法應該是使用屬性,如:

public class myaccount

}public myaccount()

}這裡myaccount類對accountnumber公共變數實施了很好的控制,它變成唯讀,不能由呼叫者類修改。

•    利用system.data.datatable訪問資料

我常常看到開發人員使用列索引從資料庫訪問資料,如:

public class myclass}}

按照這種寫法,如果列順序在sql查詢匹配資料時發生了變化,你的應用程式將會受到影響,正確的做法應該是使用列名訪問資料。

public class myclass}}

這樣的**更加穩固,列順序發生變化不會給應用程式造成任何影響,如果在乙個地方使用區域性變數儲存列名更好,即使將來你的列名發生了變化,也不用修改應用程式**。

程式設計師最容易犯得錯誤

如果你對程式設計不感興趣,你的 一定會寫的很爛。結果不僅僅你的事業沒有任何前途,你的團隊也會因此而痛苦不堪。對諸如抽象 多型 介面 異常處理最佳方案等程式設計概念不熟悉的人寫出的 必然是設計糟糕,可讀性和可維護性都極差。有些程式設計師喜歡過於聰明的在乙個複雜的語句裡包含多個步驟的 這會使 的可讀性很...

乙個C C 程式設計師最容易犯的錯誤!

首先讓我們看一段 void getctrlrectviaparent lprect lprc,hwnd hwnddlg,uint idctrl 類似上面那個 函式 大家有沒有發現問題呢?錯在 粗略咋一看,並沒有不對的地方啊!奇怪了,可就是當執行時,100 出錯!為什麼呢?如果你找不到錯誤來,那麼請你...

程式設計師最容易犯的幾個技術上的錯誤

如果你對程式設計不感興趣,你的 一定會寫的很爛。結果不僅僅你的事業沒有任何前途,你的團隊也會因此而痛苦不堪。對諸如抽象 多型 介面 異常處理最佳方案等程式設計概念不熟悉的人寫出的 必然是設計糟糕,可讀性和可維護性都極差。有些程式設計師喜歡過於聰明的在乙個複雜的語句裡包含多個步驟的 這會使 的可讀性很...