다음을 통해 공유


Visual Basic 코딩 규칙

업데이트: 2008년 7월

다음 지침은 샘플과 설명서를 개발하기 위해 Microsoft에서 사용하는 지침입니다. Visual Basic 언어 사양에서는 코딩 표준을 정의하지 않습니다.

  • 코딩 규칙을 사용하면 사용자가 레이아웃이 아닌 코드의 내용에 집중할 수 있도록 일관성 있는 모양의 코드를 만들 수 있습니다.

  • 규칙을 사용하면 사용자가 이전 경험을 기반으로 예상할 수 있기 때문에 코드를 더 신속하게 이해할 수 있습니다.

  • 규칙을 사용하면 코드를 더 쉽게 복사하고 변경하며 유지할 수 있습니다.

  • 규칙에는 Visual Basic에서의 "최선의 방법"이 반영되어 있습니다.

토론

명명 규칙

  • 명명 지침은 클래스 라이브러리 개발을 위한 디자인 지침에 설명되어 있습니다.

  • Visual Studio 디자이너 도구로 만든 개체의 이름을 지침에 맞게 변경할 필요는 없습니다.

  • Imports 문을 추가하는 대신 네임스페이스 한정자를 사용합니다. 프로젝트에서 기본적으로 네임스페이스를 가져오는 경우에는 코드를 복사하고 붙여넣기할 때 코드가 IntelliSense에서 비정규화된 상태로 실행되므로 코드를 정규화할 필요가 없습니다. 긴 줄로 된 코드를 읽기 쉽도록 분리할 때 정규화된 이름은 "."다음에 분리할 수 있습니다. 예를 들면 다음과 같습니다.

    Dim collection As System.Diagnostics. _
           InstanceDataCollectionCollection
    
  • 변수 이름의 일부로 "My"나 "my"를 사용하지 마십시오. My 개체와 혼동될 수 있습니다.

레이아웃 규칙

좋은 레이아웃에서는 서식 지정을 사용하여 코드 구조를 명확히 나타내고 코드를 쉽게 읽을 수 있도록 합니다.

  • 서식 다시 적용 기능을 사용하여 코드를 기본 설정(자동 들여쓰기, 네 자 들여쓰기, 탭을 공백으로 저장)으로 서식 지정합니다. 자세한 내용은 옵션 대화 상자, 텍스트 편집기, Basic, VB 관련을 참조하십시오.

  • 한 줄에 하나의 문만 사용합니다. Visual Basic 줄 연속 문자(:)를 사용하지 마십시오.

  • 한 줄에 하나의 선언만 사용합니다.

  • 서식 다시 적용 기능에서 연속된 줄의 서식을 지정하지 않는 경우 연속된 줄을 탭 정지 하나만큼 들여 씁니다.

  • 메서드 및 속성 정의 사이에 적어도 하나 이상의 빈 줄을 추가합니다.

주석 규칙

  • 코드 줄의 끝에는 주석을 사용하지 않습니다. 주석은 별도의 줄에 삽입합니다.

  • 주석 텍스트는 대문자로 시작합니다.

  • 주석 끝에는 마침표를 찍습니다.

  • 주석 구분 기호(')와 주석 텍스트 사이에 공백 하나를 삽입합니다.

    ' 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
    

형식 유추

지역 형식 변수에 대해 형식 유추를 사용합니다.

Public Sub GetQuery()
  Dim filterValue = "London"
  Dim query = From customer In customers _
              Where customer.Country = filterValue
End Sub

이벤트 처리기의 완화된 대리자

코드에서 이벤트 인수를 사용하지 않는 경우 완화된 대리자를 사용하고 이벤트 인수를 포함하지 않습니다.

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를 사용하지 마십시오.

  • 예외를 처리하려면 Try...Catch 문을 사용합니다.

    Dim conn As New SqlConnection("connection string")
    Try
      Conn.Open()
    Catch ex As SqlException
    
    Finally
      Conn.Close()
    End Try
    
  • Using 문은 Try...Catch 문과 Dispose 메서드 호출을 결합하여 코드를 간단하게 만듭니다. Try...Catch 문을 사용하고 Finally 블록의 코드에서만 Dispose 메서드를 호출하는 경우 대신 Using 문을 사용합니다.

    Using redPen As New Pen(color.Red)
      ' Insert code here.
    End Using
    

IsNot 키워드 사용

Not...Is Nothing보다 IsNot 키워드를 우선적으로 사용합니다.

AndAlso 및 OrElse 키워드 사용

불필요한 코드를 건너뛰어 예외를 방지하고 성능을 향상하려면 비교를 수행할 때 And 대신 AndAlso를 사용하고 Or 대신 OrElse를 사용합니다.

' Avoid a null reference exception. If the left side of the AndAlso 
' operator is False, the right side is not evaluated and a null 
' exception is not thrown.
If nullableObject IsNot Nothing AndAlso nullableObject = testValue Then

End If

' Avoid an unnecessary resource-intensive operation. If the left side
' of the OrElse operator is True, the right side is not evaluated and 
' a resource-intensive operation is not called.
If testCondition OrElse ResourceIntensiveOperation() Then

End If

폼의 기본 인스턴스

My.Forms.Form1.ShowDialog 대신 Form1.ShowDialog를 사용합니다.

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 WhatHappened(ByVal source As Object, _
                              ByVal e As WhatHappenedEventArgs)
    
  • RaiseEvent 메서드를 호출하기 전에 이벤트가 Nothing(null)인지 확인하지 마십시오. RaiseEvent는 이벤트를 발생시키기 전에 Nothing을 확인합니다.

공유 멤버 사용

인스턴스 변수에서 호출하지 않고 클래스 이름을 사용하여 Shared 멤버를 호출합니다.

MsgBox 함수 사용

MessageBox.Show나 Console.WriteLine 대신 MsgBox를 사용합니다. MsgBox 함수를 지원하지 않는 Silverlight와 같은 환경에서 적절한 대체 방법을 사용합니다.

My 네임스페이스 사용

.NET Framework 클래스 라이브러리나 Visual Basic 런타임 라이브러리보다 My 기능을 우선적으로 사용합니다. 자세한 내용은 개체(Visual Basic)를 참조하십시오.

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"
    
  • 쿼리의 요소에 별칭을 지정하여 익명 형식의 속성 이름이 파스칼식 대/소문자에 따라 올바로 대문자로 표시되도록 합니다.

    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" _
                            Select cust.LastName, cust.CompanyName
    
  • Where 절을 사용하여 조인을 암시적으로 정의하는 대신 Join 절을 사용하여 조인을 명시적으로 정의합니다.

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

Visual Basic 런타임 라이브러리 멤버 사용

.NET Framework 클래스 라이브러리보다 Visual Basic 런타임 라이브러리를 우선적으로 사용합니다.

샘플 사용 지침

일반

  • Design Guidelines for Class Library Developers의 디자인 지침을 따릅니다.

  • MsgBox 호출의 프롬프트와 제목을 지정합니다.

  • 적절한 경우에는 리소스 파일을 사용합니다.

  • Option Strict On을 각 파일에서 사용하거나 프로젝트 설정으로 사용합니다.

  • 경고가 모두 있는 상태에서 컴파일합니다.

  • 한 파일에 Class, Structure 또는 Interface를 각각 하나만 정의합니다.

  • 기본 인코딩을 사용하여 파일을 저장합니다.

지역화

  • 가능하면 AutoSize 속성을 사용합니다.

  • 컨트롤을 숨기거나 겹치지 마십시오.

  • 컨트롤을 정렬하여 문장을 만들지 마십시오.

  • 다른 문자열에서 문자를 제거하여 문자열을 빌드하지 마십시오.

  • culture 중립적인 그래픽을 사용합니다.

  • Tahoma나 MS Sans Serif 글꼴만 사용합니다.

액세스 가능성

  • 색 선택 대화 상자의 시스템 탭에 있는 색을 사용합니다.

  • 모든 메뉴, 레이블, 단추 등에 대해 액셀러레이터를 사용합니다.

  • 다음 표에 설명된 것과 같이 컨트롤 속성을 설정합니다.

속성

설정 값

AccessibleDescription

컨트롤에 대한 설명입니다.

AccessibleName

컨트롤의 이름입니다.

AccessibleRole

기본값을 사용하거나 컨트롤에서 다른 역할을 수행하는 경우에는 이 속성을 다시 설정합니다.

TabIndex

논리적 순서로 설정합니다.

Text

클릭할 수 있는 모든 컨트롤에는 키보드 선택키(바로 가기)가 있어야 합니다.

Font Size

기본값을 사용하거나 10포인트 이상으로 설정합니다.

ForeColor

기본값

BackColor

기본값

BackgroundImage

기본값

보안

보안 코딩 지침의 설명을 따릅니다.

참고 항목

기타 리소스

클래스 라이브러리 개발을 위한 디자인 지침

보안 코딩 지침

변경 기록

날짜

변경 내용

이유

2008년 7월

LINQ, XML 리터럴, 개체 이니셜라이저, 형식 유추 및 완화된 대리자와 같은 새로운 언어 기능과 관련된 지침이 추가되어 업데이트되었습니다.

콘텐츠 버그 수정