C#編程規(guī)范

標(biāo)簽: C# 編程規(guī)范


命名規(guī)約

  • 【強(qiáng)制】代碼中的命名均不能以下劃線或美元符號(hào)開(kāi)始,也不能以下劃線或美元符號(hào)結(jié)束。
  • 【強(qiáng)制】代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
  • 【強(qiáng)制】類(lèi)名,方法名屬性,枚舉名,接口名,委托,事件,命名空間,使用UpperCamelCase風(fēng)格,必須遵從駝峰形式。通用縮寫(xiě)除外,如BO
  • 【強(qiáng)制】參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase 風(fēng)格,必須遵從駝峰形式。如localValue
  • 【強(qiáng)制】常量命名全部大寫(xiě),單詞間用下劃線隔開(kāi),力求語(yǔ)義表達(dá)完整清楚,不要嫌名字長(zhǎng)。如MAX_STOCK_COUNT
  • 【強(qiáng)制】抽象類(lèi)命名使用AbstractBase開(kāi)頭;異常類(lèi)命名使用Exception結(jié)尾;測(cè)試類(lèi)命名以它要測(cè)試的類(lèi)的名稱(chēng)開(kāi)始,以Test 結(jié)尾。
  • 【強(qiáng)制】杜絕完全不規(guī)范的縮寫(xiě),避免望文不知義。AbstractClass縮寫(xiě)命名成AbsClass;condition縮寫(xiě)命名成condi,此類(lèi)隨意縮寫(xiě)嚴(yán)重降低了代碼的可閱讀性。
  • 【推薦】如果使用到了設(shè)計(jì)模式,建議在類(lèi)名中體現(xiàn)出具體模式。如public class OrderFactory;

格式規(guī)約

  • 【強(qiáng)制】大括號(hào)的使用約定。如果是大括號(hào)內(nèi)為空,則簡(jiǎn)潔地寫(xiě)成{}即可,不需要換行;如果是非空代碼塊則兩個(gè)半括號(hào)都另起一行和類(lèi)首對(duì)齊。
  • 【強(qiáng)制】左小括號(hào)和右邊相鄰字符之間不出現(xiàn)空格;同樣,右小括號(hào)和左邊相鄰字符之間也不出現(xiàn)空格。
  • 【強(qiáng)制】if/for/while/switch/do等保留字與小括號(hào)之間都必須加空格。
  • 【強(qiáng)制】任何運(yùn)算符左右必須加一個(gè)空格。
  • 【強(qiáng)制】縮進(jìn)采用4個(gè)空格,禁止使用tab字符。或者在設(shè)置里面把tab設(shè)置為四個(gè)空格
  • 【強(qiáng)制】單行字符數(shù)限制不超過(guò)120個(gè),超出需要換行,換行時(shí)遵循如下原則:
    1) 第二行相對(duì)第一行縮進(jìn)4個(gè)空格,從第三行開(kāi)始,不再繼續(xù)縮進(jìn),參考示例。
    2) 運(yùn)算符與下文一起換行。
    3) 方法調(diào)用的點(diǎn)符號(hào)與下文一起換行。
    4) 在多個(gè)參數(shù)超長(zhǎng),逗號(hào)后進(jìn)行換行。
    5) 在括號(hào)前不要換行。
  • 【強(qiáng)制】方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格。
  • 【強(qiáng)制】IDE 的text file encoding設(shè)置為UTF-8;IDE中文件的換行符使用Unix格式,不要使用windows格式。
  • 【推薦】沒(méi)有必要增加若干空格來(lái)使某一行的字符與上一行的相應(yīng)字符對(duì)齊。
  • 【推薦】方法體內(nèi)的執(zhí)行語(yǔ)句組、變量的定義語(yǔ)句組、不同的業(yè)務(wù)邏輯之間或者不同的語(yǔ)義之間插入一個(gè)空行。相同業(yè)務(wù)邏輯和語(yǔ)義之間不需要插入空行。

OOP 規(guī)約

  • 【強(qiáng)制】避免通過(guò)一個(gè)類(lèi)的對(duì)象引用訪問(wèn)此類(lèi)的靜態(tài)變量或靜態(tài)方法,無(wú)謂增加編譯器解析成本,直接用類(lèi)名來(lái)訪問(wèn)即可。
  • 【強(qiáng)制】所有的相同類(lèi)型的包裝類(lèi)對(duì)象之間值的比較,全部使用Equals方法比較。
  • 【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請(qǐng)放在Init方法中。。
  • 【推薦】使用索引訪問(wèn)用String的Split方法得到的數(shù)組時(shí),需做最后一個(gè)分隔符后有無(wú)內(nèi)容的檢查,否則會(huì)有拋IndexOutOfBoundsException的風(fēng)險(xiǎn)。
  • 【推薦】當(dāng)一個(gè)類(lèi)有多個(gè)構(gòu)造方法,或者多個(gè)同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀。
  • 【推薦】 類(lèi)內(nèi)方法定義順序依次是:公有方法或保護(hù)方法 > 屬性 > 私有方法。
  • 【推薦】循環(huán)體內(nèi),字符串的連接方式,使用StringBuilder的append方法進(jìn)行擴(kuò)展。
  • 【推薦】類(lèi)成員與方法訪問(wèn)控制從嚴(yán)
    1) 如果不允許外部直接通過(guò)new來(lái)創(chuàng)建對(duì)象,那么構(gòu)造方法必須是private。
    2) 工具類(lèi)不允許有public或default構(gòu)造方法。
    3) 類(lèi)非static成員變量并且與子類(lèi)共享,必須是protected。
    4) 類(lèi)非static成員變量并且僅在本類(lèi)使用,必須是private。
    5) 類(lèi)static成員變量如果僅在本類(lèi)使用,必須是private。
    6) 若是static成員變量,必須考慮是否為final。
    7) 類(lèi)成員方法只供類(lèi)內(nèi)部調(diào)用,必須是private。
    8) 類(lèi)成員方法只對(duì)繼承類(lèi)公開(kāi),那么限制為protected。

控制語(yǔ)句

  • 【強(qiáng)制】在一個(gè)switch塊內(nèi),每個(gè)case要么通過(guò)break/return等來(lái)終止,要么注釋說(shuō)明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè)case為止;在一個(gè)switch塊內(nèi),都必須包含一個(gè)default語(yǔ)句并且放在最后,即使它什么代碼也沒(méi)有。
  • if/else/for/while/do語(yǔ)句中必須使用大括號(hào)。即使只有一行代碼,避免使用單行的形式
  • 【推薦】表達(dá)異常的分支時(shí),少用if-else方式,這種方式可以改寫(xiě)成:
if (condition) 
{
    ...
    return obj;
}
// 接著寫(xiě)else的業(yè)務(wù)邏輯代碼;
  • 【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語(yǔ)句,將復(fù)雜邏輯判斷的結(jié)果賦值給一個(gè)有意義的布爾變量名,以提高可讀性。
  • 【推薦】循環(huán)體中的語(yǔ)句要考量性能,以下操作盡量移至循環(huán)體外處理,如定義對(duì)象、變量、獲取數(shù)據(jù)庫(kù)連接,進(jìn)行不必要的try-catch操作(這個(gè)try-catch是否可以移至循環(huán)體外)。
  • 【參考】下列情形,需要進(jìn)行參數(shù)校驗(yàn)
    1) 調(diào)用頻次低的方法。
    2) 執(zhí)行時(shí)間開(kāi)銷(xiāo)很大的方法。此情形中,參數(shù)校驗(yàn)時(shí)間幾乎可以忽略不計(jì),但如果因?yàn)閰?shù)錯(cuò)誤導(dǎo)致中間執(zhí)行回退,或者錯(cuò)誤,那得不償失。
    3) 需要極高穩(wěn)定性和可用性的方法。
    4) 對(duì)外提供的開(kāi)放接口,不管是RPC/API/HTTP接口。
    5) 敏感權(quán)限入口。
  • 【參考】下列情形,不需要進(jìn)行參數(shù)校驗(yàn):
    1) 極有可能被循環(huán)調(diào)用的方法。但在方法說(shuō)明里必須注明外部參數(shù)檢查要求。
    2) 底層調(diào)用頻度比較高的方法。
    3) 被聲明成private只會(huì)被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方法的代碼傳入?yún)?shù)已經(jīng)做過(guò)檢查或者肯定不會(huì)有問(wèn)題,此時(shí)可以不校驗(yàn)參數(shù)。

注釋規(guī)約

  • 【強(qiáng)制】所有的類(lèi)都必須添加創(chuàng)建者和創(chuàng)建日期。
  • 【強(qiáng)制】方法內(nèi)部單行注釋?zhuān)诒蛔⑨屨Z(yǔ)句上方另起一行,使用//注釋。方法內(nèi)部多行注釋使用/* */注釋?zhuān)⒁馀c代碼對(duì)齊。
  • 【強(qiáng)制】所有的枚舉類(lèi)型字段必須要有注釋,說(shuō)明每個(gè)數(shù)據(jù)項(xiàng)的用途。
  • 【推薦】代碼修改的同時(shí),注釋也要進(jìn)行相應(yīng)的修改,尤其是參數(shù)、返回值、異常、核心邏輯等的修改。
  • 【參考】合理處理注釋掉的代碼。盡量在目標(biāo)代碼上方詳細(xì)說(shuō)明,而不是簡(jiǎn)單的注釋掉。如果無(wú)用,則直接刪除。
  • 【參考】對(duì)于注釋的要求:
    第一、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;
    第二、能夠描述業(yè)務(wù)含義,使別的程序員能夠迅速了解到代碼背后的信息。完全沒(méi)有注釋的大段代碼對(duì)于閱讀者形同天書(shū),注釋是給自己看的,即使隔很長(zhǎng)時(shí)間,也能清晰理解當(dāng)時(shí)的思路;注釋也是給繼任者看的,使其能夠快速接替自己的工作。
  • 【參考】好的命名、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡(jiǎn)準(zhǔn)確、表達(dá)到位。避免出現(xiàn)注釋的一個(gè)極端:過(guò)多過(guò)濫的注釋?zhuān)a的邏輯一旦修改,修改注釋是相當(dāng)大的負(fù)擔(dān)。

參考資料

[1] 阿里巴巴java開(kāi)發(fā)手冊(cè)
[2] C#標(biāo)準(zhǔn)命名規(guī)范

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容