Visual Basic 命名慣例
http://msdn.microsoft.com/zh-tw/library/0b283bse(v=VS.100).aspx
- 名稱中的每一個單字以大寫字母做為開頭,例如 FindLastRecord 與 RedrawMyForm。
- 函式與方法名稱以動詞做為開頭,例如 InitNameArray 或 CloseDialog。
- 類別 (Class)、結構、模組和屬性 (Property) 名稱會以名詞做為開頭,例如 EmployeeName 或 CarAccessory。
- 介面名稱以 "I" 前置字元做為開頭,之後並接著一個名詞或名詞片語 (例如 IComponent),或是接著可描述介面行為的形容詞 (例如 IPersistable)。 不要使用底線,並且盡量不要使用縮寫,因為縮寫可能導致混淆。
- 事件處理常式名稱以名詞為開頭,以描述其後跟隨 "EventHandler" 後置詞的事件類型,例如 "MouseEventHandler"。
- 在事件引數類別的名稱中,包含 "EventArgs" 後置詞。
- 如果事件擁有「之前」、「之後」的概念,請使用現在式或過去式的後置字元,例如在 "ControlAdd" 或 "ControlAdded" 中。
- 對於冗長或常用的詞彙,可使用縮寫以使名稱保持合理的長度,例如使用 "HTML",而不使用 "Hypertext Markup Language"。 一般來說,變數名稱大於 32 個字元者將會難以在低解析度的螢幕上閱讀。 此外,確認您的縮寫名稱在整個應用軟體中維持一致。 在專案中隨意變換 "HTML" 與 "Hypertext Markup Language" 會造成混淆。
- 避免在內部範圍使用與外部範圍相同的名稱。 存取不正確的變數會導致錯誤發生。 若名稱相同的變數與關鍵字產生衝突,則您必須以適當的型別程式庫前置關鍵字來識別之。 例如,如果有一個名為 Date 的變數,則您只能藉由呼叫 DateTime.Date 的方式,使用內建的 Date 函式。
Visual Basic 編碼慣例
http://msdn.microsoft.com/zh-tw/library/h63fsef3(v=VS.100).aspx
命名規範
- 編碼慣例會建立一致的程式碼外觀,以便讀取器 (Reader) 可以將焦點放在內容,而非配置。
- 慣例可讓讀取器更迅速地了解程式碼,因為這可供讀取器根據先前的經驗進行假設。
- 使用命名空間 (Namespace) 限定性條件,而非加入 Imports 陳述式。 如果依預設在專案中匯入了命名空間,您不必完整限定程式碼,因為在複製和貼上時,它將利用 IntelliSense 以未限定方式執行。 當您分割長的程式碼行使其更容易閱讀時,可在 "." 之後分割限定名稱 (Qualified Name)。例如:
Dim collection As System.Diagnostics. InstanceDataCollectionCollection
- 請不要使用 "My" 或 "my" 做為變數名稱的一部分。 這會與 My 物件產生混淆。
配置慣例
- 使用美化排列功能的預設設定 (智慧型縮排、4 個字元縮排、將定位點儲存為空格),將程式碼格式化。
- 每行只使用一個陳述式。 請不要使用 Visual Basic 行接續字元 (:)
- 每行只使用一個宣告。
- 如果美化排列沒有格式化連續行,則將連續行縮排一個定位停駐點 (Tab Stop)。
- 在方法與屬性定義之間加入至少一個空白行。
註解慣例
- 請不要在程式碼行的結尾使用註解, 將註解放在個別一行。
- 以大寫字母做為註解文字開頭。
- 以句號結束註解。
- 在註解分隔符號 (') 與註解文字之間插入一個空格。
- 請不要建立在註解周圍,並且已格式化的星號區塊。
程式結構
- 在使用 Main 方法時,請對新的主控台應用程式 (Console Application) 使用預設建構,並對命令列引數使用 My
Sub Main() For Each argument As String In My.Application.CommandLineArgs ' Add code here to use the string variable. Next End Sub
語言方針
-
字串資料型別,使用 & 來串連字串:
MsgBox("hello" & vbCrLf & "goodbye")
-
字串資料型別,若要在迴圈 (Loop) 中附加字串,請使用 StringBuilder 物件
Dim longString As New System.Text.StringBuilder For count As Integer = 1 To 1000 longString.Append(count) Next
-
型別推斷,善加利用區域變數(local variables)的型別推斷:
Public Sub GetQuery() Dim filterValue = "London" Dim query = From customer In customers Where customer.Country = filterValue End Sub
-
如果您不要在程式碼中使用事件引數(event arguments),請使用比較不嚴謹的委派 (Delegate) 並省略事件引數:
Public Sub Form1_Load() Handles Form1.Load End Sub
-
使用 Integer,而非不帶正負號的型別,除非是針對記憶體有限的情況。
-
陣列:如以下
'======在宣告行上初始化陣列時,請使用短語法,如 Dim letters1() As String = {"a", "b", "c"} '而不是以下 'Dim letters2() As String = New String() {"a", "b", "c"} '將陣列指示項放在變數上,不要放在型別上,如 Dim letters3() As String = {"a", "b", "c"} '而不是以下 'Dim letters4 As String() = {"a", "b", "c"} ======'在宣告和初始化基本資料型別的陣列時,請使用 { } 語法,如 Dim letters5() As String = {"a", "b", "c"} '而不是以下 'Dim letters6(2) As String 'letters6(0) = "a" 'letters6(1) = "b" 'letters6(2) = "c"
-
使用With關鍵字:對一個物件使用一連串的呼叫時,請考慮使用 With 關鍵字:
With orderLog .Log = "Application" .Source = "Application Name" .MachineName = "Computer Name" End With
-
在 For 或 For Each 陳述式中使用迴圈變數的型別推斷
'以下是 For 陳述式中使用型別推斷的範例 For count = 0 To 2 MsgBox(names(count)) Next '以下是 For Each 陳述式中使用型別推斷的範例 For Each name In names MsgBox(name) Next
-
使用 Try...Catch 和 Using 陳述式處理例外狀況,不要使用 On Error Goto。Using 陳述式將 Try...Catch 陳述式與 Dispose 方法的呼叫結合在一起,以簡化程式碼。 如果您要使用 Try...Catch 陳述式,而且 Finally 區塊中的唯一程式碼是Dispose 方法的呼叫,請改用 Using 陳述式
'以下是 Try...Catch 陳述式範例 Dim conn As New SqlConnection("connection string") Try Conn.Open() Catch ex As SqlException Finally Conn.Close() End Try ' 以下是Using範例 Using redPen As New Pen(color.Red) ' Insert code here. End Using
-
使用 IsNot 關鍵字:優先使用 IsNot 關鍵字,而非 Not...Is Nothing。
-
使用 AndAlso 和 OrElse 關鍵字, 在執行比較時,若要略過不必要的程式碼以避免例外狀況並提升效能,請使用 AndAlso 代替 And 並使用 OrElse 代替 Or.。
'以下是AndAlso範例 If nullableObject IsNot Nothing AndAlso nullableObject = testValue Then End If '以下是OrElse範例 If testCondition OrElse ResourceIntensiveOperation() Then End If
-
表單的預設執行個體,使用 Form1.ShowDialog,而非 My.Forms.Form1.ShowDialog。
-
New 關鍵字,使用短的執行個體化 (Instantiation),並為新物件使用物件初始設定式,代替無參數的建構函式 (Constructor)::
Dim employees As New List(Of String) '不要用以下 Dim employees2 As List(Of String) = New List(Of String) '給新的物件初始設定值,代替無參數的建構函式 Dim orderLog As New EventLog With { .Log = "Application", .Source = "Application Name", .MachineName = "Computer Name"}
-
事件處理
'使用 Handles,而非 AddHandler: Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click End Sub '使用 AddressOf,且不要明確地對委派 (Delegate) 執行個體化。 Dim closeItem As New ToolStripMenuItem("Close", Nothing, AddressOf ToolStripMenuItem1_Click) Me.MainMenuStrip.Items.Add(closeItem) '當您定義事件時,請使用短語法並且讓編譯器定義委派: Public Event WhatHappened(ByVal source As Object, ByVal e As WhatHappenedEventArgs) '在呼叫 RaiseEvent 方法之前,不要檢查事件是否為 Nothing (null)。 RaiseEvent 會在引發事件之前檢查 Nothing。
-
使用共用成員,使用類別名稱呼叫 Shared 成員,而不要從執行個體變數進行呼叫。
-
使用 MsgBox函式,取代 MessageBox.Show 或 Console.WriteLine。 在不支援 MsgBox 函式 (例如 Silverlight) 的環境中,請使用適合的替代方案。
-
使用 My 命名空間,優先使用 My 功能,而非 .NET Framework 類別庫 (Class Library) 或 Visual Basic 執行階段程式庫。
-
使用 XML 常值,XML 常值 (Literal) 會簡化在您使用 XML 時所遇到的最常見工作 (例如載入、查詢和轉換)。 當您以 XML 進行開發時,請遵循下列方針:
Private Function GetHtmlDocument( ByVal items As IEnumerable(Of XElement)) As String Dim htmlDoc = <html> <body> <table border="0" cellspacing="2"> <%= From item In items Select <tr> <td style="width:480"> <%= item.<title>.Value %> </td> <td><%= item.<pubDate>.Value %></td> </tr> %> </table> </body> </html> Return htmlDoc.ToString() End Function
-
使用 XML 常值建立 XML 文件和片段,而不要直接呼叫 XML API。
-
在檔案或專案等級匯入 XML 命名空間,以充分利用 XML 常值的效能最佳化。
-
使用 XML 軸屬性 (Property) 存取 XML 文件中的項目和屬性 (Attribute)。
-
使用內嵌運算式,以加入值並從現有值建立 XML,而不要使用如 Add 方法之類的 API 呼叫:
-
-
使用 Visual Basic 執行階段程式庫成員
LINQ 查詢
- 使用有意義的名稱做為查詢變數的名稱:
Dim seattleCustomers = From cust In customers Where cust.City = "Seattle"
- 在查詢中使用別名項目,以確保匿名型別的屬性名稱大寫採用正確的 Pascal 大小寫:
Dim customerOrders = From customer In customers Join order In orders On customer.CustomerID Equals order.CustomerID Select Customer = customer, Order = order
- 當結果中的屬性名稱會變成模稜兩可時,請重新命名屬性。 例如,如果您的查詢傳回客戶名稱和訂單 ID,請不要保留為結果中的 Name 和 ID,而是加以重新命名:
Dim customerOrders2 = From cust In customers Join ord In orders On cust.CustomerID Equals ord.CustomerID Select CustomerName = cust.Name, OrderID = ord.ID
- 在查詢變數和範圍變數的宣告中使用型別推斷:
Dim customerList = From cust In customers
- 將查詢子句對齊在 From 陳述式下方:
Dim newyorkCustomers = From cust In customers Where cust.City = "New York" Select cust.LastName, cust.CompanyName
- 將 Where 子句使用在其他查詢子句之前,以確保後來的查詢子句會在已縮減且篩選過的資料集上運作:
Dim newyorkCustomers2 = From cust In customers Where cust.City = "New York" Order By cust.LastName
- 使用 Join 子句明確定義聯結 (Join),而不要使用 Where 子句隱含定義聯結:
Dim customerList2 = From cust In customers Join order In orders On cust.CustomerID Equals order.CustomerID Select cust, order
沒有留言:
張貼留言