以前工做中整理的一篇編碼規範。html
全部的方法都應該以描述這段代碼的功能的一段簡明註釋開始(方法是幹什麼)。這種描述不該該包括執行過程細節(它是怎麼作的)函數
/// <summary> /// 把對象類型轉化爲指定類型 /// </summary> /// <typeparam name="T">動態類型 </typeparam> /// <param name="value">要轉化的源對象 </param> /// <returns> 轉化後的指定類型的對象,轉化失敗引起異常。</returns> public static T CastTo<T>(this object value)
代碼行註釋工具
若是某一功能須要多行代碼,並有多個邏輯結構,應在此代碼前添加註釋,說明此塊代碼的處理思路及注意事項等
註釋重新行增長,與代碼開始處左對齊
註釋雙斜線與註釋之間以空格分開,示例以下:this
1 public void Dispose(){ 2 // 若是鏈接已打開,則關閉鏈接並釋放資源 3 if(this.connection.State == ConnectionState.Open ){ 4 this.connection.Close(); 5 this.connection.Dispose(); 6 } 7 }
變量註釋編碼
變量需添加註釋,說明變量的用途
Class級變量使用///
生成的Xml標籤格式的文檔註釋spa
/// <summary> /// 文檔名稱 /// </summary> public static string docName = "";
方法級的變量註釋能夠放在變量聲明語句後,與上下行的註釋左對齊,註釋與代碼間以
Tab
鍵分隔code
public void CreateDoc() { string docType = ""; //文檔類型 string author = ""; //做者 DateTime createDate = DateTime.Now; //建立世界 }
PascalCasing:xml
包含一個或多個單詞,每一個單詞首字母大寫,其他小寫
使用範圍:命名空間、類、接口、方法、屬性、事件、非私有字段、枚舉值htm
namespace System.IO public static class Console public enum FileAccess
camelCasing:
包含一個或多個單詞,第一個單詞首字母小寫,其他單詞首字母大寫
使用範圍:方法參數、局部變量
public string GetName(int productId){ string productName = null; }
**_camelCasing:**
"_"+camelCasing的方式
使用範圍:私有字段
private string _productName;
UPPER_CAPS:
包含多個單詞,每一個單詞的全部字母大寫,單詞之間使用"_"鏈接
使用範圍:const常量
public const string DEFAULT_NAME = "default";
示例:
namespace ConsoleApp { public delegate void SalesOutEventHandler(); public class Product { public event SalesOutEventHandler OnSalesOut; public Product GetProductById(int productId) { return null; } private enum ProductType { } } }
標識符命名約定
類的名字使用名詞
避免使用單詞縮寫,除非是廣爲人知的,好比:HTTP
,IO
接口以I
字母開頭
同一項目不一樣命名空間中的類,命名避免重複
第一個單詞爲動詞
返回值爲bool
類型,則加Is
,Can
,Try
前綴
儘可能使用短而有意義的單詞
單字符變量名通常用於生命週期很是短的變量,如for
,foreach
中遞增變量能夠被命名爲i
若是變量表示集合,則變量名使用複數,如RowsCount
命名控件使用匈牙利命名法,前綴遵循同一個縮寫表
在帶單位的值變量後加「_camelCasing」格式的單位,如:public void CreateCache(int cacheSize_mb)
類型成員的排列順序自上而下依次爲:
字段: 私有字段、受保護字段
屬性: 私有屬性、受保護屬性、公有屬性
事件: 私有事件、受保護事件、公有事件
構造函數: 參數數量最少的構造函數,參數數量中等的構造函數,參數數量最多的構造函數
方法: 重載方法的排列順序與構造函數相同,從參數數量最少往下至參數最多
每行代碼不宜過長,應在屏幕寬度以內,約爲80-120個字符左右。換行規則以下:
在逗號後換行
在操做符後換行
在高層換行而不是在低層換行
換行後與上一行語句對齊
推薦寫法:
var n = a * b / (c - g + f) + 4 * z;
不推薦寫法:
var n = a * b / (c - g + f) + 4 * z;
每一個方法的有效代碼行數(不包括註釋和空行)應保持在50行之內
空行是爲了將邏輯相關的代碼分塊,以便提升閱讀性
在如下狀況使用兩個空行:
類聲明和接口聲明之間
兩個類聲明之間
枚舉與類聲明之間
在如下狀況使用一個空行:
方法與方法、屬性與屬性之間
方法中變量聲明與語句之間
方法與方法之間
方法不一樣邏輯塊之間
類中屬性與方法、屬性與字段、方法與字段之間
註釋與它註釋的語句之間不空行,與其餘語句之間空一行
在如下狀況使用空格:
在VS編輯器中可使用快捷鍵格式化代碼
參數列表的逗號後,
void UpdateDate(int a, int b)二元操做符,
a += b - c;強制類型轉換後,
c = (char) a;
代碼縮進使用Tab鍵,不要使用空格,Tab鍵的寬度爲4個字符,VS中設置以下:
【工具】-【選項】-【文本編輯器】-【C#】-【製表符】,選中【保留製表符】
把花括號放在前一條語句的末尾,VS中設置以下:
【工具】-【選項】-【文本編輯器】-【C#】-【格式設置】-【新行】,取消右側全部勾選
項目 | 註釋內容 |
---|---|
類 | 類的目的,開發歷史 |
接口 | 接口的目的,如何使用 |
字段/屬性 | 字段描述 |
方法註釋 | 方法做用,返回值,拋出的異常,調用的前提和後置條件 |
方法內部註釋 | 控制結構,複雜的代碼,處理順序 |
參數 | 用來作什麼,約束,前提條件 |
局部變量 | 用處,目的 |
MSDN文檔註釋標籤 https://msdn.microsoft.com/zh-cn/library/5ast78ax(v=vs.140).aspx
標記 | 說明 |
---|---|
<c> | 提供了一種將說明中的文本標記爲代碼的方法 |
<code> | 提供了一種將多行指示爲代碼的方法 |
<example> | 能夠指定使用方法或其餘庫成員的示例。通常狀況下,這將涉及到<code>標記的使用。 |
<exception> | 對可從當前編譯環境中獲取的異常的引用。 |
<include> | 引用描述源代碼中類型和成員的另外一文件中的註釋。 |
<list> | 用於定義表或定義列表中的標題行。 |
<para> | 用於諸如<summary>、<remarks> 或 <returns> 等標記內,使您將結構添加到文本中。 |
<param> | 應當用於方法聲明的註釋中,以描述方法的一個參數。 |
<paramref> | 提供了一種指示詞爲參數的方法。 |
<permission> | 將成員的訪問記入文檔。 |
<remarks> | 用於添加有關某個類型的信息,從而補充由 <summary> 所指定的信息。 |
<returns> | 應當用於方法聲明的註釋,以描述返回值。 |
<see> | 從文本內指定連接。 |
<seealso> | 對能夠經過當前編譯環境進行調用的成員或字段的引用。 |
<summary> | 應當用於描述類型或類型成員。 |
<value> | 描述屬性。 |
功能 | VS2010 | VS2013 | 說明 |
---|---|---|---|
文檔格式化 | Ctrl+E, Ctrl+D | Ctrl+K, Ctrl+D | 格式化當前文檔 |
選定內容格式化 | Ctrl+E, Ctrl+F | Ctrl+K, Ctrl+F | 格式化選中內容 |
註釋 | Ctrl+E, Ctrl+C | Ctrl+K, Ctrl+C | 註釋當前行 |
取消註釋 | Ctrl+E, Ctrl+U | Ctrl+K, Ctrl+U | 取消註釋當前行 |
複製 | Ctrl+C | - | 複製光標所在行,不須要選中 |
剪切 | Ctrl+X | - | 剪切光標所在行,不須要選中 |
刪除 | Ctrl+L | - | 刪除光標所在行,不須要選中 |
摺疊 | - | Ctrl+M, Ctrl+O | 摺疊當前文檔 |
展開摺疊 | - | Ctrl+M, Ctrl+L | 展開當前文檔 |
MSDN開發語言和工具 https://msdn.microsoft.com/zh-cn/library/aa187916.aspxC#語言規範 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\2052\CSharp Language Specification.docx