Visual Basic のコーディング規則

Microsoft は、ここで示すガイドラインに従ってサンプルおよびドキュメントを開発しています。 同じコーディング規則に従うと、次のような利点があります。

  • コードの見た目が統一されるため、コードを読むときに、レイアウトではなく内容に重点を置くことができます。

  • これまでの経験に基づいて推測できるようになるため、コードをすばやく理解できます。

  • コードのコピー、変更、保守がより簡単になります。

  • コードが Visual Basic の "ベスト プラクティス" に従っていることを確認できます。

名前付け規則

  • 名前付けのガイドラインについては、「Guidelines for Names」を参照してください。

  • "My" または "my" を変数名の一部として使用しないようにします。 My オブジェクトとの混同を招くからです。

  • 自動生成されたコードに含まれるオブジェクトの名前をこのガイドラインに合わせて変更する必要はありません。

レイアウト規則

  • タブを空白として挿入し、4 文字インデントによるスマート インデントを使用します。

  • コード エディターで [コードの再フォーマット] を使用してコードの書式を再設定します。 詳細については、「[オプション]、[テキスト エディター]、[基本] (Visual Basic)」を参照してください。

  • 1 つの行には 1 つのステートメントのみを記述します。 Visual Basic の行区切り記号 (:) は使用しないでください。

  • 言語で許可される場所では、明示的な行継続文字 "_" ではなく暗黙的な行継続を使用します。

  • 1 つの行には 1 つの宣言のみを記述します。

  • [コードの再フォーマット] で継続行が自動的に書式設定されない場合は、継続行のインデントを手動で 1 タブ ストップに設定します。 ただし、リストの項目は常に左揃えにします。

    a As Integer,
    b As Integer
    
  • メソッド定義とプロパティ定義の間に少なくとも 1 行の空白行を追加します。

コメント規則

  • コメントは、コード行の末尾ではなく別の行に記述します。

  • 英語でコメントを記述する場合、コメント テキストの始まりには英大文字を使用し、終わりにはピリオドを使用します。

  • コメント デリミター (') とコメント テキストの間に空白を 1 つ挿入します。

    ' Here is a comment.
    
  • アスタリスク (*) を整形したブロックでコメントを囲まないようにします。

プログラムの構造

  • Main メソッドを使用するときには、新しいコンソール アプリケーションの既定の構造を使用し、コマンド ライン引数には My を使用します。

    Sub Main()
      For Each argument As String In My.Application.CommandLineArgs
        ' Add code here to use the string variable. 
      Next 
    End Sub
    

言語ガイドライン

文字列型 (String)

  • 文字列を連結するには、アンパサンド (&) を使用します。

    MsgBox("hello" & vbCrLf & "goodbye")
    
  • ループ内での文字列の追加には StringBuilder オブジェクトを使用します。

    Dim longString As New System.Text.StringBuilder
    For count As Integer = 1 To 1000
      longString.Append(count)
    Next
    

イベント ハンドラー内の厳密でないデリゲート

イベント ハンドラーの引数 (Object および EventArgs) は明示的に修飾しません。 イベントに渡されるイベント引数 (sender as Object、e as EventArgs など) を使用しない場合は、厳密でないデリゲートを使用して、コードでイベント引数を省略します。

Public Sub Form1_Load() Handles Form1.Load
End Sub

Unsigned データ型

  • 特に必要でない限り、unsigned 型ではなく Integer を使用します。

配列

  • 宣言行で配列を初期化するときは短い構文を使用します。 たとえば、次のような構文を使用します。

    Dim letters1 As String() = {"a", "b", "c"}
    

    次のような構文は使用しません。

    Dim letters2() As String = New String() {"a", "b", "c"}
    
  • 配列指定子は、変数ではなく型に指定します。 たとえば、次のような構文を使用します。

    Dim letters4 As String() = {"a", "b", "c"}
    

    次のような構文は使用しません。

    Dim letters3() 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

例外処理を使用する場合の Try...Catch/Using ステートメントの使用

On Error Goto は使用しないでください。

IsNot キーワードの使用

Not...Is Nothing の代わりに IsNot キーワードを使用します。

New キーワード

  • 短い形式のインスタンス化を使用します。 たとえば、次のような構文を使用します。

    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"}
    

イベント処理

  • AddHandler ではなく Handles を使用します。

    Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click
    End Sub
    
  • AddressOf を使用し、デリゲートの明示的なインスタンス化は避けます。

    Dim closeItem As New ToolStripMenuItem( 
        "Close", Nothing, AddressOf ToolStripMenuItem1_Click)
    Me.MainMenuStrip.Items.Add(closeItem)
    
  • イベントを定義するときには、短い構文を使用し、デリゲートの定義はコンパイラに任せます。

    Public Event SampleEvent As EventHandler(Of SampleEventArgs)
    ' or 
    Public Event SampleEvent(ByVal source As Object, 
                              ByVal e As SampleEventArgs)
    
  • RaiseEvent メソッドを呼び出す前にイベントが Nothing (null) かどうか確認しないようにします。 RaiseEvent は、イベントを発生させる前に Nothing かどうか確認します。

共有メンバーの使用

Shared メンバーの呼び出しにはクラス名を使用し、インスタンス変数からは行わないようにします。

XML リテラルの使用

XML リテラルを使用すると、XML 操作時に行う最も一般的なタスク (読み込み、クエリ、変換など) を簡素化できます。 XML を使用して開発を行う場合は、次のガイドラインに従います。

  • XML API を直接呼び出す代わりに XML リテラルを使用して XML ドキュメントおよびフラグメントを作成します。

  • ファイル レベルまたはプロジェクト レベルで XML 名前空間をインポートし、XML リテラルによるパフォーマンスの最適化を利用します。

  • XML 軸プロパティを使用して XML ドキュメント内の要素と属性にアクセスします。

  • Add メソッドなどの API 呼び出しを使用する代わりに、埋め込み式を使用して既存の値から値を組み込んで 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
    

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
    
  • Where 句を使用して暗黙的に結合操作を定義する代わりに、Join 句を使用して明示的に結合操作を定義します。

    Dim customerList2 = From cust In customers 
                        Join order In orders 
                          On cust.CustomerID Equals order.CustomerID 
                        Select cust, order
    

参照

その他の技術情報

安全なコーディングのガイドライン