標籤:
先八卦一下,昨天寫了C# 編碼通訊協定(一),得到了@h82258652的補充,感到非常欣慰,一是感覺他的觀點擴充了我的視野,豐富了我的看法,所以更堅定了我繼續寫部落格的想法,由於是五筆打字,經常不寫東西,有些字的字根都忘記了,所以通過寫部落格也可以多記些字根,二是決定把多年的一些東西分享出來,一起溝通交流,這樣也能夠共同進步,共同成長。
一、編碼實踐
1、一個檔案的代碼避免超過500行。當然這個在特殊情況下也是可以的,只是一個建設吧!
2、方法要避免超過25行。當然這個在特殊情況下也是可以的,只是一個建設吧!
3、每行不要超過80個字元。
4、不要手動編輯任何機器代碼。
5、避免對顯而易見的代碼作注釋,代碼應該是自解釋的,由可讀性強的變數和方法組成的好的代碼應該不需要注釋。
6、除了“0”與“1”, 不要用數值寫入程式碼,聲明一個常量代替。
7、僅對本來就是常量的值使用const修飾符,例如一周的天數。
8、避免對唯讀變更使用const,在此情況下,使用readonly修飾符:
public class MyClass{ public const int DaysInWeek = 7; public readonly int Number; public MyClass(int someValue) { Number = someValue; } }
9、僅捕捉你需要顯式處理的異常。
10、在拋出異常的catch語句中,總是拋出最初異常(或由最初異常構建的另一個異常),以保持最初錯誤的堆棧位置。
第一種:catch(Exception ex){ MessageBox.Show(ex.Message); throw; // 等同於拋出原始異常}第二種:catch(Exception ex){ MessageBox.Show(ex.Message); throw ex; // 這樣會吃掉異常點,重設堆棧中的異常起始點}第三種:catch{ throw; // 可捕獲所有類型的異常}第四種:catch(Exception ex){ MessageBox.Show(ex.Message); throw new Exception("經過進一步封裝的異常", ex); // 經過進一步封裝的異常,第二個參數儲存了原來的異常資訊}推薦使用第一種用法
11、最小化應用程式的程式集代碼(即EXE用戶端程式集)。用類庫來包含商務邏輯。
12、避免顯式類型轉換。使用as操作符防禦性地進行轉換類型:
Dog dog = new GermanShepherd();GermanShepherd shepherd = dog as GermanShepherd;if (shepherd != null){ ... }
13、調用委託前始終檢查委託是否為空白。
14、不要假定一種類型能支援某個介面。防禦性地為介面查詢是否支援該介面。
SomeType obj1;IMyInterface obj2;obj2 = obj1 as IMyInterface;if(obj2 != null){ obj2.Method1(); }else{ ...}
15、永遠不要寫入程式碼將呈現給使用者的字串,而是使用資源。
16、永遠不要寫入程式碼布署時可能修改的字串,例如連接字串。
17、用String.Empty代替"":
// 避免string name = "";//推薦string name = String.Empty;
18、當頻繁地使用一個字串超過4次,使用StringBuilder,不要使用string。
19、當提供一個靜態成員變數時,總是提供一個靜態建構函式。
20、除非在switch語句中跳轉,否則永遠不要用goto語句。
21、不要在使用泛型的代碼中對System.Object進行類型轉化。使用約束或as運算子:
class SomeClass{}// 避免class MyClass<T>{ void SomeMethod(T t) { object temp = t; SomeClass obj = (SomeClass)temp; }}// 建議class MyClass<T> where T : SomeClass{ void SomeMethod(T t) { SomeClass obj = t; }}
22、不要在泛型介面中定義約束條件。介面層級的約束常常可以用強型別代替:
public class Customer{...}// 避免public interface IList<T> where T : Customer{...}// 建議public interface ICustomerList : IList<Customer>
23、lock鎖私人唯讀靜態對象。不要使用lock (this)、lock (typeof (MyType)) 和 lock ("myLock")等。
C# 編碼通訊協定(二)