C#編碼,書寫規範
C#編碼規範
C#編程<>規範<>
Version 2.0目錄
第一章 概述
<>規範<>製定原則
1 方便代碼的交流和維護.
2 不影響編碼的效率,不與大眾習慣衝突.
3 使代碼更美觀,閱讀更方便.
4 使代碼的邏輯更清晰,更易於理解.
術語定義
Pascal 大小寫
將標識符的首字母和後麵連接的每個單詞的首字母都大寫.可以對三字符或更多字符的標識符使用Pascal 大小寫.例如:
BackColor
Camel 大小寫
標識符的首字母小寫,而每個後麵連接的單詞的首字母都大寫.例如:
backColor
文件命名組織
1.3.1文件命名
1 文件名遵從Pascal命名法,無特殊情況,擴展名小寫.
2 使用統一而又通用的文件擴展名: C# 類 .cs
1.3.2文件注釋
1 在每個文件頭必須包含以下注釋說明
/*----------------------------------------------------------------
// Copyright (C) 2004 東軟集團有限公司
// 版權所有.
//
// 文件名:
// 文件功能描述:
//
//
// 創建標識:
//
// 修改標識:
// 修改描述:
//
// 修改標識:
// 修改描述:
//----------------------------------------------------------------*/
文件功能描述隻需簡述,具體詳情在類的注釋中描述.
創建標識和修改標識由創建或修改人員的拚音或英文名加日期組成.如:
李軼20040408
一天內有多個修改的隻需做一個在注釋說明中做一個修改標識就夠了.
在所有的代碼修改處加上修改標識的注釋.
第二章 代碼外觀
2.1 列寬
代碼列寬控製在110字符左右.
2.2 換行
當表達式超出或即將超出規定的列寬,遵循以下規則進行換行
1,在逗號後換行.
2, 在操作符前換行.
3,規則1優先於規則2.
當以上規則會導致代碼混亂的時候自己采取更靈活的換行規則.
2.3 縮進
縮進應該是每行一個Tab(4個空格),不要在代碼中使用Tab字符.
Visual Studio.Net設置:工具->選項->文本編輯器->C#->製表符->插入空格
2.4 空行
空行是為了將邏輯上相關聯的代碼分塊,以便提高代碼的可閱讀性.
在以下情況下使用兩個空行
1,接口和類的定義之間.
2,枚舉和類的定義之間.
3,類與類的定義之間.
在以下情況下使用一個空行
1,方法與方法,屬性與屬性之間.
2,方法中變量聲明與語句之間.
3,方法與方法之間.
4,方法中不同的邏輯塊之間.
5,方法中的返回語句與其他的語句之間.
6,屬性與方法,屬性與字段,方法與字段之間.
7,注釋與它注釋的語句間不空行,但與其他的語句間空一行.
2.5 空格
在以下情況中要使用到空格
1, 關鍵字和左括符 "(" 應該用空格隔開.如
while (true)
注意在方法名和左括符 "(" 之間不要使用空格,這樣有助於辨認代碼中的方法調用與關鍵字.
多個參數用逗號隔開,每個逗號後都應加一個空格.
除了 . 之外,所有的二元操作符都應用空格與它們的操作數隔開.一元操作符,++及--與操作 數間不需要空格.如
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++)
{
n++;
}
PrintSize("size is " + size + "");
4, 語句中的表達式之間用空格隔開.如
for (expr1; expr2; expr3)
2.6 括號 - ()
1, 左括號"(" 不要緊靠關鍵字,中間用一個空格隔開.
2, 左括號"(" 與方法名之間不要添加任何空格.
3, 沒有必要的話不要在返回語句中使用().如
if (condition)
Array.Remove(1)
return 1
2.7 花括號 - {}
1, 左花括號 "{" 放於關鍵字或方法名的下一行並與之對齊.如
if (condition)
{
}
public int Add(int x, int y)
{
}
2, 左花括號 "{" 要與相應的右花括號 "}"對齊.
3, 通常情況下左花括號 "{"單獨成行,不與任何語句並列一行.
4, if,while,do語句後一定要使用{},即使{}號中為空或隻有一條語句.如
if (somevalue == 1)
{
somevalue = 2;
}
5, 右花括號 "}" 後建議加一個注釋以便於方便的找到與之相應的 {.如
while (1)
{
if (valid)
{
} // if valid
else
{
} // not valid
} // end forever
第三章 程序注釋
3.4 注釋概述
1,修改代碼時,總是使代碼周圍的注釋保持最新.
2,在每個例程的開始,提供標準的注釋樣本以指示例程的用途,假設和限製很有幫助.注釋樣本應該是解釋它為什麼存在和可以做什麼的簡短介紹.
3,避免在代碼行的末尾添加注釋;行尾注釋使代碼更難閱讀.不過在批注變量聲明時,行尾注釋是合適的;在這種情況下,將所有行尾注釋在公共製表位處對齊.
4 ,避免雜亂的注釋,如一整行星號.而是應該使用空白將注釋同代碼分開.
5 ,避免在塊注釋的周圍加上印刷框.這樣看起來可能很漂亮,但是難於維護.
6 ,在部署發布之前,移除所有臨時或無關的注釋,以避免在日後的維護工作中產生混亂.
7 ,如果需要用注釋來解釋複雜的代碼節,請檢查此代碼以確定是否應該重寫它.盡一切可能不注釋難以理解的代碼,而應該重寫它.盡管一般不應該為了使代碼更簡單以便於人們使用而犧牲性能,但必須保持性能和可維護性之間的平衡.
8 ,在編寫注釋時使用完整的句子.注釋應該闡明代碼,而不應該增加多義性.
9 ,在編寫代碼時就注釋,因為以後很可能沒有時間這樣做.另外,如果有機會複查已編寫的代碼,在今天看來很明顯的東西六周以後或許就不明顯了.
10 ,避免多餘的或不適當的注釋,如幽默的不主要的備注.
11, 使用注釋來解釋代碼的意圖.它們不應作為代碼的聯機翻譯.
12, 注釋代碼中不十分明顯的任何內容.
13 ,為了防止問題反複出現,對錯誤修複和解決方法代碼總是使用注釋,尤其是在團隊環境中.
14 ,對由循環和邏輯分支組成的代碼使用注釋.這些是幫助源代碼讀者的主要方麵.
15 ,在整個應用程序中,使用具有一致的標點和結構的統一樣式來構造注釋.
16 ,用空白將注釋同注釋分隔符分開.在沒有顏色提示的情況下查看注釋時,這樣做會使注釋很明顯且容易被找到.
17 ,在所有的代碼修改處加上修改標識的注釋.
18 ,為了是層次清晰,在閉合的右花括號後注釋該閉合所對應的起點.
namespace Langchao.Procument.Web
{
} // namespace Langchao.Procument.Web
3.2 文檔型注釋
該類注釋采用.Net已定義好的Xml標簽來標記,在聲明接口,類,方法,屬性,字段都應該使用該類注釋,以便代碼完成後直接生成代碼文檔,讓別人更好的了解代碼的實現和接口.如
///MyMethod is a method in the MyClass class.
///Here's how you could make a second paragraph in a description.
///
///for information about output statements.
///
///
///
public static void MyMethod(int Int1)
{
}
3.3 類c注釋
該類注釋用於
1 不再使用的代碼.
2 臨時測試屏蔽某些代碼.
用法
/*
[修改標識]
[修改原因]
. . . (the source code )
*/
3.4 單行注釋
該類注釋用於
1 方法內的代碼注釋.如變量的聲明,代碼或代碼段的解釋.注釋示例:
//
// 注釋語句
//
private int number;
或
// 注釋語句
private int number;
2 方法內變量的聲明或花括號後的注釋, 注釋示例:
if ( 1 == 1) // always true
{
statement;
} // always true
3.5 注釋標簽
標簽
用法
作用
c>text
text 希望將其指示為代碼的文本.
為您提供了一種將說明中的文本標記為代碼的方法.使用 將多行指示為代碼
content
content段落文本.
用於諸如 或 等標記內,使您得以將結構添加到文本中.
description
name 為方法參數名.將此名稱用單引號括起來 (' ').
應當用於方法聲明的注釋中,以描述方法的一個參數.
name
要引用的參數名.將此名稱用雙引號括起來 (" ").
標記為您提供了一種指示詞為參數的方法.可以處理 XML 文件,從而用某種獨特的方法格式化該參數.
cref = "member" 對可以通過當前編譯環境進行調用的成員或字段的引用.編譯器檢查到給定代碼元素存在後,將 member 傳遞給輸出 XML 中的元素名.必須將 member 括在雙引號 (" ") 中.
使您得以從文本內指定鏈接.使用 指示希望在"請參閱"一節中出現的文本.
cref = "member" 對可以通過當前編譯環境進行調用的成員或字段的引用.編譯器檢查到給定代碼元素存在後,將 member 傳遞給輸出 XML 中的元素名.必須將 member 括在雙引號 (" ") 中
使您得以指定希望在"請參閱"一節中出現的文本.使用 從文本
description
description
代碼示例的說明.
使用 標記可以指定使用方法或其他庫成員的示例.一般情況下,這將涉及到 標記的使用.
content
content 為希望將其標記為代碼的文本.
記為您提供了一種將多行指示為代碼的方法.使用 指示應將說明中的文本標記為代碼
description
此處description 為對象的摘要.
應當用於描述類型成員.使用 以提供有關類型本身的信息.
description
cref = "member" 對可從當前編譯環境中獲取的異常的引用.編譯器檢查到給定異常存在後,將 member 轉換為輸出 XML 中的<>規範<>化元素名.必須將 member 括在雙引號 (" ") 中.
description 說明.
標記使您可以指定類能夠引發的異常.
filename 包含文檔的文件名.該文件名可用路徑加以限定.將 filename 括在單引號中 (' ').
Tagpath:filename 中指向標記名的標記路徑.將此路徑括在單引號中 (' ').
name 注釋前邊的標記中的名稱說明符;名稱具有一個 id.
id
位於注釋之前的標記的 id.將此 id 括在雙引號中 (" ").
標記使您得以引用描述源代碼中類型和成員的另一文件中的注釋.這是除了將文檔注釋直接置於源代碼文件中之外的另一種可選方法.
標記使用 XML XPath 語法.有關自定義 使用的方法,請參閱 XPath 文檔.
term
description
term
description
term 定義的項,該項將在 text 中定義.
description 目符號列表或編號列表中的項或者 term 的定義.
塊用於定義表或定義列表中的標題行.定義表時,隻需為標題中的項提供一個項.
列表中的每一項用 塊指定.創建定義列表時,既需要指定 term 也需要指定 text.但是,對於表,項目符號列表或編號列表,隻需為 text 提供一個項.
列表或表所擁有的 塊數可以根據需要而定.
description
cref = "member" 對可以通過當前編譯環境進行調用的成員或字段的引用.編譯器檢查到給定代碼元素存在後,將 member 轉換為輸出 XML 中的<>規範<>化元素名.必須將 member 括在雙引號 (" ") 中.
description 成員的訪問的說明.
標記使您得以將成員的訪問記入文檔.System.Security.PermissionSet 使您得以指定對成員的訪問.
description
description 成員的說明.
標記是可以指定有關類或其他類型的概述信息的位置. 是可以描述該類型的成員的位置.
description
description 返回值的說明.
標記應當用於方法聲明的注釋,以描述返回值.
property-description
property-description 屬性的說明.
標記使您得以描述屬性.請注意,當在 Visual Studio .NET 開發環境中通過代碼向導添加屬性時,它將會為新屬性添加 標記.然後,應該手動添加 標記以描述該屬性所表示的值.
第四章 申明
每行聲明數
一行隻建議作一個聲明,並按字母順序排列.如
int level; //推薦
int size; //推薦
int x, y; //不推薦
初始化
建議在變量聲明時就對其做初始化.
位置
變量建議置於塊的開始處,不要總是在第一次使用它們的地方做聲明.如
void MyMethod()
{
int int1 = 0; // beginning of method block
if (condition)
{
int int2 = 0; // beginning of "if" block
...
}
}
不過也有一個例外
for (int i = 0; i < maxLoops; i++)
{
...
}
應避免不同層次間的變量重名,如
int count;
...
void MyMethod()
{
if (condition)
{
int count = 0; // 避免
...
}
...
}
類和接口的聲明
1 在方法名與其後的左括號間沒有任何空格.
2 左花括號 "{" 出現在聲明的下行並與之對齊,單獨成行.
3 方法間用一個空行隔開.
字段的聲明
不要使用是 public 或 protected 的實例字段.如果避免將字段直接公開給開發人員,可以更輕鬆地對類進行版本控製,原因是在維護二進製兼容性時字段不能被更改為屬性.考慮為字段提供 get 和set 屬性訪問器,而不是使它們成為公共的. get 和 set 屬性訪問器中可執行代碼的存在使得可以進行後續改進,如在使用屬性或者得到屬性更改通知時根據需要創建對象.下麵的代碼示例闡釋帶有get 和 set 屬性訪問器的私有實例字段的正確使用. 示例:
public class Control: Component
{
private int handle;
public int Handle
{
get
{
return handle;
}
}
}
第五章 命名<>規範<>
命名概述
名稱應該說明"什麼"而不是"如何".通過避免使用公開基礎實現(它們會發生改變)的名稱,可以保留簡化複雜性的抽象層.例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement().
命名原則是:
選擇正確名稱時的困難可能表明需要進一步分析或定義項的目的.使名稱足夠長以便有一定的意義,並且足夠短以避免冗長.唯一名稱在編程上僅用於將各項區分開.表現力強的名稱是為了幫助人們閱讀;因此,提供人們可以理解的名稱是有意義的.不過,請確保選擇的名稱符合適用語言的規則和標準.
以下幾點是推薦的命名方法.
1,避免容易被主觀解釋的難懂的名稱,如方麵名 AnalyzeThis(),或者屬性名 xxK8.這樣的名稱會導致多義性.
2,在類屬性的名稱中包含類名是多餘的,如 Book.BookTitle.而是應該使用 Book.Title.
3,隻要合適,在變量名的末尾或開頭加計算限定符(Avg,Sum,Min,Max,Index).
4,在變量名中使用互補對,如 min/max,begin/end 和 open/close.
5,布爾變量名應該包含 Is,這意味著 Yes/No 或 True/False 值,如 fileIsFound.
6,在命名狀態變量時,避免使用諸如 Flag 的術語.狀態變量不同於布爾變量的地方是它可以具有兩個以上的可能值.不是使用 documentFlag,而是使用更具描述性的名稱,如 documentFormatType. (此項隻供參考)
7,即使對於可能僅出現在幾個代碼行中的生存期很短的變量,仍然使用有意義的名稱.僅對於短循環索引使用單字母變量名,如 i 或 j. 可能的情況下,盡量不要使用原義數字或原義字符串,如
For i = 1 To 7.而是使用命名常數,如 For i = 1 To NUM_DAYS_IN_WEEK 以便於維護和理解.
大小寫規則
大寫
標識符中的所有字母都大寫.僅對於由兩個或者更少字母組成的標識符使用該約定.例如:
System.IO
System.Web.UI
下表匯總了大寫規則,並提供了不同類型的標識符的示例.
標識符
大小寫
示例
類
Pascal
AppDomain
枚舉類型
Pascal
ErrorLevel
枚舉值
Pascal
FatalError
事件
Pascal
ValueChange
異常類
Pascal
WebException
注意 總是以 Exception 後綴結尾.
隻讀的靜態字段
Pascal
RedValue
接口
Pascal
IDisposable
注意 總是以 I 前綴開始.
方法
Pascal
ToString
命名空間
Pascal
System.Drawing
屬性
Pascal
BackColor
公共實例字段
Pascal
RedValue
注意 很少使用.屬性優於使用公共實例字段.
受保護的實例字段
Camel
redValue
注意 很少使用.屬性優於使用受保護的實例字段.
私有的實例字段
Camel
redValue
參數
Camel
typeName
方法內的變量
Camel
backColor
縮寫
為了避免混淆和保證跨語言交互操作,請遵循有關區縮寫的使用的下列規則:
1 不要將縮寫或縮略形式用作標識符名稱的組成部分.例如,使用 GetWindow,而不要使用 GetWin.
2 不要使用計算機領域中未被普遍接受的縮寫.
3 在適當的時候,使用眾所周知的縮寫替換冗長的詞組名稱.例如,用 UI 作為 User Interface 縮
寫,用 OLAP 作為 On-line Analytical Processing 的縮寫.
4在使用縮寫時,對於超過兩個字符長度的縮寫請使用 Pascal 大小寫或 Camel 大小寫.例如,使用 HtmlButton 或 HTMLButton.但是,應當大寫僅有兩個字符的縮寫,如,System.IO,而不是 System.Io.
5 不要在標識符或參數名稱中使用縮寫.如果必須使用縮寫,對於由多於兩個字符所組成的縮寫請
使用Camel 大小寫,雖然這和單詞的標準縮寫相衝突.
命名空間
1,命名命名空間時的一般性規則是使用公司名稱,後跟技術名稱和可選的功能與設計,如下所示.
CompanyName.TechnologyName[.Feature][.Design]
例如:
namespace Langchao.Procurement //浪潮公司的采購單管理係統
namespace Langchao.Procurement.DataRules //浪潮公司的采購單管理係統的業務規則模塊
2,命名空間使用Pascal大小寫,用逗號分隔開.
3,TechnologyName 指的是該項目的英文縮寫,或軟件名.
4,命名空間和類不能使用同樣的名字.例如,有一個類被命名為Debug後,就不要再使用Debug作為一個名稱空間名.
類
1,使用 Pascal 大小寫.
2,用名詞或名詞短語命名類.
3,使用全稱避免縮寫,除非縮寫已是一種公認的約定,如URL,HTML
4 ,不要使用類型前綴,如在類名稱上對類使用 C 前綴.例如,使用類名稱 FileStream,而不是
CFileStream.
5 ,不要使用下劃線字符 (_).
6 ,有時候需要提供以字母 I 開始的類名稱,雖然該類不是接口.隻要 I 是作為類名稱組成部分的整個單詞的第一個字母,這便是適當的.例如,類名稱 IdentityStore 是適當的.在適當的地方,使用複合單詞命名派生的類.派生類名稱的第二個部分應當是基類的名稱.例如,ApplicationException 對於從名為 Exception 的類派生的類是適當的名稱,原因ApplicationException 是一種Exception.請在應用該規則時進行合理的判斷.例如,Button 對於從 Control 派生的類是適當的名稱.盡管按鈕是一種控件,但是將 Control 作為類名稱的一部分將使名稱不必要地加長.
public class FileStream
public class Button
public class String
接口
以下規則概述接口的命名指南:
1,用名詞或名詞短語,或者描述行為的形容詞命名接口.例如,接口名稱 IComponent 使用描述性
名詞.接口名稱 ICustomAttributeProvider 使用名詞短語.名稱 IPersistable 使用形容詞.
2,使用 Pascal 大小寫.
3,少用縮寫.
4,給接口名稱加上字母 I 前綴,以指示該類型為接口.在定義類/接口對(其中類是接口的標準
實現)時使用相似的名稱.兩個名稱的區別應該隻是接口名稱上有字母 I 前綴.
5,不要使用下劃線字符 (_).
6,當類是接口的標準執行時,定義這一對類/接口組合就要使用相似的名稱.兩個名稱的不同之處
隻是接口名前有一個I前綴.
以下是正確命名的接口的示例.
public interface IServiceProvider
public interface IFormatable
以下代碼示例闡釋如何定義 IComponent 接口及其標準實現 Component 類.
public interface IComponent
{
// Implementation code goes here.
}
public class Component: IComponent
{
// Implementation code goes here.
}
屬性 (Attribute)
應該總是將後綴 Attribute 添加到自定義屬性類.以下是正確命名的屬性類的示例.
public class ObsoleteAttribute
{
}
枚舉 (Enum)
枚舉 (Enum) 值類型從 Enum 類繼承.以下規則概述枚舉的命名指南:
1 對於 Enum 類型和值名稱使用 Pascal 大小寫.
2 少用縮寫.
3 不要在 Enum 類型名稱上使用 Enum 後綴.
4 對大多數 Enum 類型使用單數名稱,但是對作為位域的 Enum 類型使用複數名稱.
5 總是將 FlagsAttribute 添加到位域 Enum 類型.
參數
以下規則概述參數的命名指南:
1,使用描述性參數名稱.參數名稱應當具有足夠的描述性,以便參數的名稱及其類型可用於在大多數情況下確定它的含義.
2,對參數名稱使用 Camel 大小寫.
3, 使用描述參數的含義的名稱,而不要使用描述參數的類型的名稱.開發工具將提供有關參數的類型的有意義的信息.因此, 通過描述意義,可以更好地使用參數的名稱.少用基於類型的參數名稱,僅在適合使用它們的地方使用它們.
4,不要使用保留的參數.保留的參數是專用參數,如果需要,可以在未來的版本中公開它們.相反,如果在類庫的未來版本中需要更多的數據,請為方法添加新的重載.
5,不要給參數名稱加匈牙利語類型表示法的前綴.
以下是正確命名的參數的示例.
Type GetType(string typeName)
string Format(string format, args() As object)
方法
以下規則概述方法的命名指南:
1 使用動詞或動詞短語命名方法.
2 使用 Pascal 大小寫.
3 以下是正確命名的方法的實例.
RemoveAll()
GetCharArray()
Invoke()
屬性 (property)
以下規則概述屬性的命名指南:
1 使用名詞或名詞短語命名屬性.
2 使用 Pascal 大小寫.
3 不要使用匈牙利語表示法.
4 考慮用與屬性的基礎類型相同的名稱創建屬性.例如,如果聲明名為 Color 的屬性,則屬
性的類型同樣應該是 Color.請參閱本主題中後麵的示例.
以下代碼示例闡釋正確的屬性命名.
public class SampleClass
{
public Color BackColor
{
// Code for Get and Set accessors goes here.
}
}
以下代碼示例闡釋提供其名稱與類型相同的屬性.
public enum Color
{
// Insert code for Enum here.
}
public class Control
{
public Color Color
{
get
{
// Insert code here.
}
set
{
// Insert code here.
}
}
}
以下代碼示例不正確,原因是 Color 屬性是 Integer 類型的.
public enum Color
{
// Insert code for Enum here.
}
public class Control
{
public int Color
{
// Insert code here
}
}
在不正確的示例中,不可能引用 Color 枚舉的成員.Color.Xxx 將被解釋為訪問一個成員,
該成員首先獲取 Color 屬性( C# 中為 int 類型)的值,然後再訪問該值的某個成員(該成
員必須是 System.Int32 的實例成員).
事件
以下規則概述事件的命名指南:
1,對事件處理程序名稱使用 EventHandler 後綴.
2,指定兩個名為 sender 和 e 的參數.sender 參數表示引發事件的對象.sender 參數始
終是object 類型的,即使在可以使用更為特定的類型時也如此.與事件相關聯的狀態封裝
在名為 e 的事件類的實例中.對 e 參數類型使用適當而特定的事件類.
3,用 EventArgs 後綴命名事件參數類.
4,考慮用動詞命名事件.
5,使用動名詞(動詞的"ing"形式)創建表示事件前的概念的事件名稱,用過去式表示事
件後.例如,可以取消的 Close 事件應當具有 Closing 事件和 Closed 事件.不要使用
BeforeXxx/AfterXxx 命名模式.
6,不要在類型的事件聲明上使用前綴或者後綴.例如,使用 Close,而不要使用 OnClose.
7,通常情況下,對於可以在派生類中重寫的事件,應在類型上提供一個受保護的方法(稱為
OnXxx).此方法隻應具有事件參數 e,因為發送方總是類型的實例.
以下示例闡釋具有適當名稱和參數的事件處理程序.
public delegate void MouseEventHandler(object sender, MouseEventArgs e);
以下示例闡釋正確命名的事件參數類.
public class MouseEventArgs : EventArgs
{
int x;
int y;
public MouseEventArgs(int x, int y)
{
this.x = x;
this.y = y;
}
public int X
{
get
{
return x;
}
}
public int Y
{
get
{
return y;
}
}
}
常量 (const)
以下規則概述常量的命名指南:
所有單詞大寫,多個單詞之間用 "_" 隔開. 如
public const string PAGE_TITLE = "Welcome";
字段
以下規則概述字段的命名指南:
1,private,protected 使用 Camel 大小寫.
2,public 使用 Pascal 大小寫.
3,拚寫出字段名稱中使用的所有單詞.僅在開發人員一般都能理解時使用縮寫.字段名稱不
要使用大寫字母.下麵是正確命名的字段的示例.
class SampleClass
{
string url;
string destinationUrl;
}
4,不要對字段名使用匈牙利語表示法.好的名稱描述語義,而非類型.
5,不要對字段名或靜態字段名應用前綴.具體說來,不要對字段名稱應用前綴來區分靜態和非靜態字段.例如,應用 g_ 或 s_ 前綴是不正確的.
6,對預定義對象實例使用公共靜態隻讀字段.如果存在對象的預定義實例,則將它們聲明為
對象本身的公共靜態隻讀字段.使用 Pascal 大小寫,原因是字段是公共的.下麵的代碼
示例闡釋公共靜態隻讀字段的正確使用.
public struct Color
{
public static readonly Color Red = new Color(0x0000FF);
public Color(int rgb)
{
// Insert code here.}
public Color(byte r, byte g, byte b)
{
// Insert code here.
}
public byte RedValue
{
get
{
return Color;
}
}
}
靜態字段
以下規則概述靜態字段的命名指南:
1,使用名詞,名詞短語或者名詞的縮寫命名靜態字段.
2,使用 Pascal 大小寫.
3,對靜態字段名稱使用匈牙利語表示法前綴.
4,建議盡可能使用靜態屬性而不是公共靜態字段.
集合
集合是一組組合在一起的類似的類型化對象,如哈希表,查詢,堆棧,字典和列表,集合的命名
建議用複數.
措詞
避免使用與常用的 .NET 框架命名空間重複的類名稱.例如,不要將以下任何名稱用作類名稱:
System,Collections,Forms 或 UI.有關 .NET 框架命名空間的列表,請參閱類庫.
另外,避免使用和以下關鍵字衝突的標識符.
AddHandler
AddressOf
Alias
And
Ansi
As
Assembly
Auto
Base
Boolean
ByRef
Byte
ByVal
Call
Case
Catch
CBool
CByte
Cchar
CDate
CDec
CDbl
Char
Cint
Class
CLng
CObj
Const
Cshort
CSng
CStr
CType
Date
Decimal
Declare
Default
Delegate
Dim
Do
Double
Each
Else
ElseIf
End
Enum
Erase
Error
Event
Exit
ExternalSource
False
Finalize
Finally
Float
For
Friend
Function
Get
GetType
Goto
Handles
If
Implements
Imports
In
Inherits
Integer
Interface
Is
Let
Lib
Like
Long
Loop
Me
Mod
Module
MustInherit
MustOverride
MyBase
MyClass
Namespace
New
Next
Not
Nothing
NotInheritable
NotOverridable
Object
On
Option
Optional
Or
Overloads
Overridable
Overrides
ParamArray
Preserve
Private
Property
Protected
Public
RaiseEvent
ReadOnly
ReDim
Region
REM
RemoveHandler
Resume
Return
Select
Set
Shadows
Shared
Short
Single
Static
Step
Stop
String
Structure
Sub
SyncLock
Then
Throw
To
True
Try
TypeOf
Unicode
Until
volatile
When
While
With
WithEvents
WriteOnly
Xor
Eval
extends
instanceof
package
var
第六章 語句
每行一個語句
每行最多包含一個語句.如
a++; //推薦
b--; //推薦
a++; b--; //不推薦
6.2 複合語句
複合語句是指包含"父語句{子語句;子語句;}"的語句,使用複合語句應遵循以下幾點
1 子語句要縮進.
2 左花括號"{" 在複合語句父語句的下一行並與之對齊,單獨成行.
3 即使隻有一條子語句要不要省略花括號" {}". 如
while (d + = s++)
{
n++;
}
6.3 return 語句
return語句中不使用括號,除非它能使返回值更加清晰.如
return;
return myDisk.size();
return (size size : defaultSize);
6.4 if, if-else,if else-if 語句
if, if-else,if else-if 語句使用格式
if (condition)
{
statements;
}
if (condition)
{
statements;
}
else
{
statements;
}
if (condition)
{
statements;
}
else if (condition)
{
statements;
}
else
{
statements;
}
6.4 for,foreach 語句
for 語句使用格式
for (initialization; condition; update)
{
statements;
}
空的 for 語句(所有的操作都在initialization,condition 或 update中實現)使用格式
for (initialization; condition; update); // update user id
foreach 語句使用格式
foreach (object obj in array)
{
statements;
}
注意 1在循環過程中不要修改循環計數器.
2對每個空循環體給出確認性注釋.
6.5 while 語句
while 語句使用格式
while (condition)
{
statements;
}
空的 while 語句使用格式
while (condition);
do - while 語句
do - while 語句使用格式
do
{
statements;
} while (condition);
switch - case 語句
switch - case 語句使用格式
switch (condition)
{
case 1:
statements;
break;
case 2:
statements;
break;
default:
statements;
break;
}
注意:
1,語句switch中的每個case各占一行.
2,語句switch中的case按字母順序排列.
3,為所有switch語句提供default分支.
4,所有的非空 case 語句必須用 break; 語句結束.
try - catch 語句
try - catch 語句使用格式
try
{
statements;
}
catch (ExceptionClass e)
{
statements;
}
finally
{
statements;
}
using 塊語句
using 塊語句使用格式
using (object)
{
statements;
}
goto 語句
goto 語句使用格式
goto Label1:
statements;
Lable1:
statements;
控件命名規則
7.1 命名方法
控件名簡寫+英文描述,英文描述首字母大寫
7.2 主要控件名簡寫對照表
控件名 簡寫 控件名 簡寫
Label lbl TextBox txt
Button btn LinkButton lnkbtn
ImageButton imgbtn DropDownList ddl
ListBox lst DataGrid dg
DataList dl CheckBox chk
CheckBoxList chkls RadioButton rdo
RadioButtonList rdolt Image img
Panel pnl Calender cld
AdRotator ar Table tbl
RequiredFieldValidator rfv CompareValidator cv
RangeValidator rv RegularExpressionValidator rev
ValidatorSummary vs CrystalReportViewer rptvew
其他
8.1 表達式
1 避免在表達式中用賦值語句
3 避免對浮點類型做等於或不等於判斷
8.2 類型轉換
1盡量避免強製類型轉換.
2如果不得不做類型轉換,盡量用顯式方式.
附錄一: 匈牙利命名法
匈牙利命名法是一名匈牙利程序員發明的,而且他在微軟工作了多年.此命名法就是通過微軟的各種產品和文檔傳出來的.多數有經驗的程序員,不管他們用的是哪門兒語言,都或多或少在使用它.
這種命名法的基本原則是:
變量名=屬性+類型+對象描述
即一個變量名是由三部分信息組成,這樣,程序員很容易理解變量的類型,用途,而且便於記憶.
下邊是一些推薦使用的規則例子,你可以挑選使用,也可以根據個人喜好作些修改再用之.
⑴屬性部分:
全局變量: g_
常量 : c_
類成員變量: m_
⑵類型部分:
指針: p
句柄: h
布爾型: b
浮點型: f
無符號: u
⑶描述部分:
初始化: Init
臨時變量: Tmp
目的對象: Dst
源對象: Src
窗口: Wnd
下邊舉例說明:
hwnd: h表示句柄,wnd表示窗口,合起來為"窗口句柄".
m_bFlag: m表示成員變量,b表示布爾,合起來為:"某個類的成員變量,布爾型,是一個狀態標誌".
東軟集團有限公司 C#編程<>規範<>2.0
C#書寫規範
一、命名
對於理解應用程序的邏輯流,命名方案是最有影響力的一種幫助。名稱應該說明“什麼”而不是“如何”。通過避免使用公開基礎實現(它們會發生改變)的名稱,可以保留簡化複雜性的抽象層。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。
命名原則是:
選擇正確名稱時的困難可能表明需要進一步分析或定義項的目的。使名稱足夠長以便有一定的意義,並且足夠短以避免冗長。唯一名稱在編程上僅用於將各項區分開。表現力強的名稱是為了幫助人們閱讀;因此,提供人們可以理解的名稱是有意義的。不過,請確保選擇的名稱符合適用語言的規則和標準。
以下幾點是推薦的命名方法。
1、方法、屬性、變量規範
•避免容易被主觀解釋的難懂的名稱,如方麵名 AnalyzeThis(),或者屬性名 xxK8。這樣的名稱會導致多義性。
•在麵向對象的語言中,在類屬性的名稱中包含類名是多餘的,如 Book.BookTitle。而是應該使用 Book.Title。
•使用動詞-名詞的方法來命名對給定對象執行特定操作的例程,如 CalculateInvoiceTotal()。
•在允許函數重載的語言中,所有重載都應該執行相似的函數。
•隻要合適,在變量名的末尾或開頭加計算限定符(Avg、Sum、Min、Max、Index)。
•在變量名中使用互補對,如 min/max、begin/end 和 open/close。
•鑒於大多數名稱都是通過連接若幹單詞構造的,請使用大小寫混合的格式以簡化它們的閱讀。另外,為了幫助區分變量和例程,請對例程名稱使用 Pascal 大小寫處理 (CalculateInvoiceTotal),其中每個單詞的第一個字母都是大寫的。對於變量名,請使用 camel 大小寫處理 (documentFormatType),其中除了第一個單詞外每個單詞的第一個字母都是大寫的。
•布爾變量名應該包含 Is,這意味著 Yes/No 或 True/False 值,如 fileIsFound。
•在命名狀態變量時,避免使用諸如 Flag 的術語。狀態變量不同於布爾變量的地方是它可以具有兩個以上的可能值。不是使用 documentFlag,而是使用更具描述性的名稱,如 documentFormatType。 (此項隻供參考)
•即使對於可能僅出現在幾個代碼行中的生存期很短的變量,仍然使用有意義的名稱。僅對於短循環索引使用單字母變量名,如 i 或 j。
•可能的情況下,盡量不要使用原義數字或原義字符串,如 For i = 1 To 7。而是使用命名常數,如 For i = 1 To NUM_DAYS_IN_WEEK 以便於維護和理解。
二、代碼書寫規範
格式化使代碼的邏輯結構很明顯。花時間確保源代碼以一致的邏輯方式進行格式化,這對於您和你的開發小組,以及以後維護源代碼的其他開發人員都有很大的幫助。
以下幾點是推薦的格式化方法。
•建立標準的縮進大小(如四個空格),並一致地使用此標準。用規定的縮進對齊代碼節。
•在發布源代碼的硬拷貝版本時使用特定的字體以及字號(新宋體、小五號)。
•在括號對對齊的位置垂直對齊左括號和右括號,如:
for (i = 0; i < 100; i++)
{
;
}
也可以使用傾斜樣式,即左括號出現在行尾,右括號出現在行首,如:
for (i = 0; i < 100; i++){
;
}
無論選擇哪種樣式,請在整個源代碼中使用那個樣式。
•沿邏輯結構行縮進代碼。沒有縮進,代碼將變得難以理解,如:
if(expression )
{
//
//此處填寫你的代碼塊;
//
}
if(expression )
{
//
//此處填寫你的代碼塊;
//
}
else
{
//
//此處填寫你的代碼塊;
//
}
縮進代碼會產生出更容易閱讀的代碼,如:
if(expression )
{
if(expression )
{
//
//此處填寫你的代碼塊;
//
}
else
{
//
//此處填寫你的代碼塊;
//
}
}
•為注釋和代碼建立最大的行長度,以避免不得不滾動源代碼編輯器,並且可以提供整齊的硬拷貝表示形式。
•在大多數運算符之前和之後使用空格,這樣做時不會改變代碼的意圖。但是,C++ 中使用的指針表示法是一個例外。
•使用空白為源代碼提供結構線索。這樣做會創建代碼“段”,有助於讀者理解軟件的邏輯分段。
•當一行內容太長而必須換行時,在後麵換行代碼中要使用縮進格式,如下:
string inserString = "Insert Into TableName(username,password,email,sex,address)"
+ "Values('Soholife','chenyp','soholife@sina.com','male','深圳福田')";
•隻要合適,每一行上放置的語句避免超過一條。例外是 C、C++、C# 或 JScript 中的循環,如 for (i = 0; i < 100; i++)。
•編寫 HTML 時,建立標準的標記和屬性格式,如所有標記都大寫或所有屬性都小寫。另一種方法是,堅持 XHTML 規範以確保所有 HTML 文檔都有效。盡管在創建 Web 頁時需折中考慮文件大小,但應使用帶引號的屬性值和結束標記以方便維護。
•編寫 SQL 語句時,對於關鍵字使用全部大寫,對於數據庫元素(如表、列和視圖)使用大小寫混合。
•在物理文件之間在邏輯上劃分源代碼。
•將每個主要的 SQL 子句放在不同的行上,這樣更容易閱讀和編輯語句,例如:
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'
•將大的複雜代碼段分為較小的、易於理解的模塊。
三、注釋
軟件文檔以兩種形式存在:外部的和內部的。外部文檔(如規範、幫助文件和設計文檔)在源代碼的外部維護。內部文檔由開發人員在開發時在源代碼中編寫的注釋組成。
不考慮外部文檔的可用性,由於硬拷貝文檔可能會放錯地方,源代碼清單應該能夠獨立存在。外部文檔應該由規範、設計文檔、更改請求、錯誤曆史記錄和使用的編碼標準組成。
內部軟件文檔的一個難題是確保注釋的維護與更新與源代碼同時進行。盡管正確注釋源代碼在運行時沒有任何用途,但這對於必須維護特別複雜或麻煩的軟件片段的開發人員來說卻是無價的。
以下幾點是推薦的注釋方法:
•如果用 C# 進行開發,請使用 XML 文檔格式,如下麵方法的注釋:
/// <summary>
/// 得到某人的年齡
/// </summary>
/// <param >用戶名</param>
/// <returns>用戶年齡</returns>
public int GetUserAge(string userName)
{
//
//此處寫你的程序代碼
//
}
•修改代碼時,總是使代碼周圍的注釋保持最新。
•在每個例程的開始,提供標準的注釋樣本以指示例程的用途、假設和限製很有幫助。注釋樣本應該是解釋它為什麼存在和可以做什麼的簡短介紹。
•避免在代碼行的末尾添加注釋;行尾注釋使代碼更難閱讀。不過在批注變量聲明時,行尾注釋是合適的;在這種情況下,將所有行尾注釋在公共製表位處對齊。
•避免雜亂的注釋,如一整行星號。而是應該使用空白將注釋同代碼分開。
•避免在塊注釋的周圍加上印刷框。這樣看起來可能很漂亮,但是難於維護。
•在部署之前,移除所有臨時或無關的注釋,以避免在日後的維護工作中產生混亂。
•如果需要用注釋來解釋複雜的代碼節,請檢查此代碼以確定是否應該重寫它。盡一切可能不注釋難以理解的代碼,而應該重寫它。盡管一般不應該為了使代碼更簡單以便於人們使用而犧牲性能,但必須保持性能和可維護性之間的平衡。
•在編寫注釋時使用完整的句子。注釋應該闡明代碼,而不應該增加多義性。
•在編寫代碼時就注釋,因為以後很可能沒有時間這樣做。另外,如果有機會複查已編寫的代碼,在今天看來很明顯的東西六周以後或許就不明顯了。
•避免多餘的或不適當的注釋,如幽默的不主要的備注。
•使用注釋來解釋代碼的意圖。它們不應作為代碼的聯機翻譯。
•注釋代碼中不十分明顯的任何內容。
•為了防止問題反複出現,對錯誤修複和解決方法代碼總是使用注釋,尤其是在團隊環境中。
•對由循環和邏輯分支組成的代碼使用注釋。這些是幫助源代碼讀者的主要方麵。
•在整個應用程序中,使用具有一致的標點和結構的統一樣式來構造注釋。
•用空白將注釋同注釋分隔符分開。在沒有顏色提示的情況下查看注釋時,這樣做會使注釋很明顯且容易被找到。
第13樓
C#編碼規範
1. 目的
為了保證企業編寫出的程序都符合相同的規範,保證一致性、統一性而建立的程序編碼規範。
2. 範圍
適用於企業所有基於.NET平台的軟件開發工作。
3. 規範內容
3.1. 代碼格式
u 所有的縮進為4個空格,使用VS.NET的默認設置。
u 在代碼中垂直對齊左括號和右括號。
if(x==0)
{
Response.Write("用戶編號必須輸入!");
}
不允許以下情況:
if(x==0) {
Response.Write("用戶編號必須輸入!");
}
或者:
if(x==0){ Response.Write("用戶編號必須輸入!");}
u 為了防止在閱讀代碼時不得不滾動源代碼編輯器,每行代碼或注釋在1024*800的顯示頻率下不得超過一顯示屏
u 當一行被分為幾行時,通過將串聯運算符放在每一行的末尾而不是開頭,清楚地表示沒有後麵的行是不完整的。
u 每一行上放置的語句避免超過一條。
u 在大多數運算符之前和之後使用空格,這樣做時不會改變代碼的意圖卻可以使代碼容易閱讀。
例:
int j = i + k;
而不應寫為
int j=i+k;
u 將大的複雜代碼節分為較小的、易於理解的模塊。
u 編寫 SQL 語句時,對於關鍵字使用全部大寫,對於數據庫元素(如表、列和視圖)使用大小寫混合。
u 將每個主要的 SQL 子句放在不同的行上,這樣更容易閱讀和編輯語句,例如: SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'
3.2. 注釋(Comment)規範
注釋規範包括:模塊(類)注釋規範、類的屬性、方法注釋規範、代碼間注釋
3.2.1. 模塊(類)注釋規範
模塊開始必須以以下形式書寫模塊注釋:
///<summary>
///模塊編號:<模塊編號,可以引用係統設計中的模塊編號>
///作用:<對此類的描述,可以引用係統設計中的描述>
///作者:作者中文名
///編寫日期:<模塊創建日期,格式:YYYY-MM-DD>
///</summary>
如果模塊有修改,則每次修改必須添加以下注釋:
///<summary>
///Log編號:<Log編號,從1開始一次增加>
///修改描述:<對此修改的描述>
///作者:修改者中文名
///修改日期:<模塊修改日期,格式:YYYY-MM-DD>
///</summary>
3.2.2. 類屬性注釋規範
在類的屬性必須以以下格式編寫屬性注釋:
/// <summary>
///屬性說明
/// </summary>
3.2.3. 方法注釋規範
在類的方法聲明前必須以以下格式編寫注釋
/// <summary>
/// 說明:<對該方法的說明>
/// </summary>
/// <param ><參數說明></param>
/// <returns>
///<對方法返回值的說明,該說明必須明確說明返回的值代表什麼含義>
/// </returns>
3.2.4. 代碼間注釋規範
代碼間注釋分為單行注釋和多行注釋:
單行注釋:
//<單行注釋>
多行注釋:
/*多行注釋1
多行注釋2
多行注釋3*/
代碼中遇到語句塊時必須添加注釋(if,for,foreach,……),添加的注釋必須能夠說明此語句塊的作用和實現手段(所用算法等等)。
3.3. 變量(Variable)命名規範
3.3.1. 程序文件(*.cs)中的變量命名規則
程序中變量名稱 = 變量的前綴 +代表變量含意的英文單詞或單詞縮寫。
1. 類模塊級的變量請用“m_”作前綴
public class hello
{
private string m_Name;
private DateTime m_Date;
}
2. 類的屬性所對應的變量,采用屬性名前加“m_”前綴的形式
public class hello
{
private string m_Name;
public string Name
{
get
{
return m_Name;
}
}
}
3. 過程級的變量不使用前綴
public class hello
{
void say()
{
string SayWord;
}
}
4. 過程的參數使用“p_”作為參數
public class hello
{
void say(string p_SayWord)
{
}
}
補充說明:
針對異常捕獲過程中的Exception變量命名,在沒有衝突的情況下,統一命名為e;
如果有衝突的情況下,可以重複e,比如:ee。
Try
{
//your code
try
{
//code
}
catch(Exception ee)
{
//your code
}
}
catch(Exception e)
{
//your code
}
補充:如果捕獲異常不需要作任何處理,則不需要定義Exception實例
例:
try
{
//your code
}
catch( Exception )
{
}
5. 鑒於大多數名稱都是通過連接若幹單詞構造的,請使用大小寫混合的格式以簡化它們的閱讀。每個單詞的第一個字母都是大寫.
6. 即使對於可能僅出現在幾個代碼行中的生存期很短的變量,仍然使用有意義的名稱。僅對於短循環索引使用單字母變量名,如 i 或 j。
7. 在變量名中使用互補對,如 min/max、begin/end 和 open/close。
8. 不要使用原義數字或原義字符串,如 For i = 1 To 7。而是使用命名常數,如 For i = 1 To NUM_DAYS_IN_WEEK 以便於維護和理解。
3.3.2. 控件命名規則
控件命名=Web控件縮寫前綴 + “_” +變量名
控件
縮寫
Label
lbl
TextBox
txt
CheckBox
chk
Button
cmd
ListBox
lst
DropDownList
drp
等等
3.4. 常量命名規範
常量名也應當有一定的意義,格式為 NOUN 或 NOUN_VERB。常量名均為大寫,字之間用下劃線分隔。
例:
private const bool WEB_ENABLEPAGECACHE_DEFAULT = true;
private const int WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT = 3600;
private const bool WEB_ENABLESSL_DEFAULT = false;
注:
變量名和常量名最多可以包含 255 個字符,但是,超過 25 到 30 個字符的名稱比較笨拙。此外,要想取一個有實際意義的名稱,清楚地表達變量或常量的用途,25 或 30 個字符應當足夠了。
3.5. 類(Class)命名規範
1. 名字應該能夠標識事物的特性。
2. 名字盡量不使用縮寫,除非它是眾所周知的。
3. 名字可以有兩個或三個單詞組成,但通常不應多於三個。
4. 在名字中,所有單詞第一個字母大寫。
例如 IsSuperUser,包含ID的,ID全部大寫,如CustomerID。
5. 使用名詞或名詞短語命名類。
6. 少用縮寫。
7. 不要使用下劃線字符 (_)。
例:
public class FileStream
public class Button
public class String
3.6. 接口(Interface)命名規範
和類命名規範相同,唯一區別是 接口在名字前加上“I”前綴
例:
interface IDBCommand;
interface IButton;
3.7. 方法(Method)命名規範
和類命名規範相同。
3.8. 命名空間(NameSpace)命名規範
和類命名規範相同。
在Visual Studio.NET的幫助中,有微軟建議的命名規範。
幫助所在位置:
英文版
Visual Studio.NET
.NET Framework
Reference
Design Guidline for Class Library Developers
Naming Guidline
中文版
Visual Studio.NET
.NET框架
參考
類庫開發人員設計指南
命名指南
最後更新:2017-04-02 00:06:38