다음을 통해 공유


공통 특성(C# 및 Visual Basic)

이 항목에서는 C# 및 Visual Basic 프로그램에 가장 일반적으로 사용되는 특성에 대해 설명합니다.

  • 전역 특성

  • 사용되지 않는 특성

  • 조건부 특성

  • 호출자 정보 특성

  • Visual Basic 특성

전역 특성

대부분의 특성은 클래스 또는 메서드와 같은 특정 언어 요소에 적용되지만 일부 특성은 전역적이어서 전체 어셈블리 또는 모듈에 적용됩니다. 예를 들어, AssemblyVersionAttribute 특성을 사용하여 다음과 같이 버전 정보를 어셈블리에 포함할 수 있습니다.

[assembly: AssemblyVersion("1.0.0.0")]
<Assembly: AssemblyVersion("1.0.0.0")>

전역 특성은 소스 코드에서 최상위 using 지시문(Visual Basic의 경우 Imports) 뒤, 형식, 모듈 또는 네임스페이스 선언 앞에 나타납니다. 전역 특성은 여러 소스 파일에 나타날 수 있지만 이러한 파일은 모두 단일 컴파일 패스에서 컴파일해야 합니다. Visual Basic 프로젝트의 경우 일반적으로 Visual Basic 프로젝트와 함께 자동으로 만들어진 AssemblyInfo.vb 파일에 전역 특성이 배치됩니다. C# 프로젝트에서는 AssemblyInfo.cs 파일에 배치됩니다.

어셈블리 특성은 어셈블리에 대한 정보를 제공하는 값입니다. 어셈블리 특성은 다음 범주로 구분됩니다.

  • 어셈블리 ID 특성

  • 정보 특성

  • 어셈블리 매니페스트 특성

  • 강력한 이름 특성

어셈블리 ID 특성

이름, 버전 및 문화권의 세 특성(적용 가능한 경우 강력한 이름도 포함)에 따라 어셈블리 ID가 결정됩니다. 이 세 특성은 어셈블리의 전체 이름을 구성하며, 코드에서 어셈블리를 참조하는 경우 이 특성이 필요합니다. 특성을 사용하여 어셈블리의 버전과 문화권을 설정할 수 있습니다. 그러나 이름 값은 어셈블리 매니페스트를 포함하는 파일을 기준으로 어셈블리가 만들어질 때 컴파일러, 어셈블리 정보 대화 상자의 Visual Studio IDE 또는 어셈블리 링커(Al.exe)에 의해 설정됩니다. AssemblyFlagsAttribute 특성은 어셈블리의 여러 복사본이 함께 있을 수 있는지 여부를 지정합니다.

다음 표는 ID 특성을 보여 줍니다.

특성

목적

AssemblyName

어셈블리의 ID를 자세히 설명합니다.

AssemblyVersionAttribute

어셈블리의 버전을 지정합니다.

AssemblyCultureAttribute

어셈블리가 지원하는 문화권을 지정합니다.

AssemblyFlagsAttribute

같은 컴퓨터, 같은 프로세스 또는 같은 응용 프로그램 도메인에서 어셈블리가 side-by-side 실행을 지원하는지 여부를 지정합니다.

정보 특성

정보 특성을 사용하면 어셈블리에 다른 회사 및 제품 정보를 제공할 수 있습니다. 다음 표에서는 System.Reflection 네임스페이스에 정의된 정보 특성을 보여 줍니다.

특성

목적

AssemblyProductAttribute

어셈블리 매니페스트에 대한 제품 이름을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyTrademarkAttribute

어셈블리 매니페스트에 대한 상표를 지정하는 사용자 지정 특성을 정의합니다.

AssemblyInformationalVersionAttribute

어셈블리 매니페스트에 대한 정보 버전을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyCompanyAttribute

어셈블리 매니페스트에 대한 회사 이름을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyCopyrightAttribute

어셈블리 매니페스트에 대한 저작권을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyFileVersionAttribute

컴파일러가 Win32 파일 버전 리소스에 대해 특정 버전 번호를 사용하도록 합니다.

CLSCompliantAttribute

어셈블리가 CLS(공용 언어 사양) 규격인지 여부를 나타냅니다.

어셈블리 매니페스트 특성

어셈블리 매니페스트 특성을 사용하여 어셈블리 매니페스트에서 정보를 제공할 수 있습니다. 여기에는 제목, 설명, 기본 별칭 및 구성이 포함됩니다. 다음 표에서는 System.Reflection 네임스페이스에 정의된 어셈블리 매니페스트 특성을 보여 줍니다.

특성

목적

AssemblyTitleAttribute

어셈블리 매니페스트에 대한 어셈블리 제목을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyDescriptionAttribute

어셈블리 매니페스트에 대한 어셈블리 설명을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyConfigurationAttribute

어셈블리 매니페스트에 대한 어셈블리 구성(예: retail 또는 debug)을 지정하는 사용자 지정 특성을 정의합니다.

AssemblyDefaultAliasAttribute

어셈블리 매니페스트에 대한 기본 별칭을 정의합니다.

강력한 이름 특성

이전 버전의 Visual Studio에서 강력한 이름으로 어셈블리를 서명하는 데는 다음과 같은 어셈블리 수준 특성을 사용했습니다.

새 버전에서도 이러한 특성이 계속 지원되지만 어셈블리 서명에는 프로젝트 디자이너에 있는 서명 페이지를 사용하는 것이 더 좋습니다. 자세한 내용은 프로젝트 디자이너, 서명 페이지방법: 어셈블리 서명(Visual Studio)을 참조하십시오.

사용되지 않는 특성

Obsolete 특성은 프로그램 엔터티를 계속 사용하지 않는 편이 좋은 것으로 표시합니다. 이 특성이 어떻게 구성되어 있는지에 따라 obsolete로 표시된 엔터티를 사용할 때마다 경고나 오류가 생성됩니다. 예를 들면 다음과 같습니다.

    <System.Obsolete("use class B")> 
    Class A
        Sub Method()
        End Sub 
    End Class 

    Class B
        <System.Obsolete("use NewMethod", True)> 
        Sub OldMethod()
        End Sub 

        Sub NewMethod()
        End Sub 
    End Class
[System.Obsolete("use class B")]
class A
{
    public void Method() { }
}
class B
{
    [System.Obsolete("use NewMethod", true)]
    public void OldMethod() { }
    public void NewMethod() { }
}

이 예제에서 Obsolete 특성은 A 클래스와 B.OldMethod 메서드에 적용됩니다. B.OldMethod에 적용되는 특성 생성자의 두 번째 인수는 true로 설정되어 있으므로 이 메서드를 사용하면 컴파일러 오류가 발생하는 반면, A 클래스를 사용하면 경고만 생성됩니다. 그러나 B.NewMethod를 호출하면 경고나 오류가 생성되지 않습니다.

특성 생성자에 첫 번째 인수로 제공되는 문자열은 경고나 오류의 일부로 표시됩니다. 예를 들어, 다음 코드를 위 정의와 함께 사용하는 경우 두 개의 경고와 한 개의 오류가 생성됩니다.

' Generates 2 warnings: 
' Dim a As New A 
' Generate no errors or warnings: 

Dim b As New B
b.NewMethod()

' Generates an error, terminating compilation: 
' b.OldMethod()
// Generates 2 warnings: 
// A a = new A(); 

// Generate no errors or warnings:
B b = new B();
b.NewMethod();

// Generates an error, terminating compilation: 
// b.OldMethod();

A 클래스에 대해 클래스 참조의 선언 및 클래스 생성자와 관련하여 경고가 하나씩 생성됩니다.

Obsolete 특성은 인수 없이 사용할 수 있지만 해당 항목이 계속 사용되지 않는 이유와 대신 사용할 항목에 대한 정보를 포함하는 것이 좋습니다.

Obsolete 특성은 단일 사용 특성이며 특성이 허용되는 임의의 엔터티에 적용할 수 있습니다. Obsolete는 ObsoleteAttribute의 별칭입니다.

조건부 특성

Conditional 특성을 사용하면 메서드 실행이 전처리 식별자에 따라 달라집니다. Conditional 특성은 ConditionalAttribute의 별칭이며, 메서드 또는 특성 클래스에 적용될 수 있습니다.

이 예제에서는 프로그램별 진단 정보를 표시하거나 표시하지 않도록 메서드에 Conditional을 적용합니다.

#Const TRACE_ON = True 
Imports System
Imports System.Diagnostics
Module TestConditionalAttribute
    Public Class Trace
        <Conditional("TRACE_ON")> 
        Public Shared Sub Msg(ByVal msg As String)
            Console.WriteLine(msg)
        End Sub 

    End Class 

    Sub Main()
        Trace.Msg("Now in Main...")
        Console.WriteLine("Done.")
    End Sub 
End Module
#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}

TRACE_ON 식별자를 정의하지 않으면 추적 결과가 출력되지 않습니다.

릴리스 빌드가 아닌 디버그 빌드에 대해서만 추적 및 기록 기능을 활성화하기 위해 Conditional 특성은 일반적으로 다음과 같이 DEBUG 식별자와 함께 사용됩니다.

<Conditional("DEBUG")> 
Shared Sub DebugMethod()

End Sub
[Conditional("DEBUG")]
static void DebugMethod()
{
}

조건부로 표시된 메서드를 호출할 때는 지정된 전처리 기호가 있는지 여부에 따라 이 호출이 포함되는지 또는 생략되는지 여부가 결정됩니다. 기호가 정의된 경우에는 호출이 포함되며 그렇지 않은 경우에는 호출이 생략됩니다. Conditional을 사용하면 다음과 같이 #if…#endif 블록 안에 메서드를 포함하는 방법보다 더 깔끔하고 세련되게 작업을 수행할 수 있고 오류 발생률도 줄어듭니다.

#If DEBUG Then 
    Sub ConditionalMethod()
    End Sub
#End If
#if DEBUG
    void ConditionalMethod()
    {
    }
#endif

조건부 메서드는 클래스 또는 구조체 선언의 메서드여야 하며 반환 값이 없어야 합니다.

여러 식별자 사용

메서드에 여러 Conditional 특성이 있는 경우 조건부 기호 중 하나라도 정의되어 있다면 메서드에 대한 호출이 포함됩니다. 즉, 기호는 OR 연산자를 사용하여 논리적으로 연결됩니다. 이 예제에서는 A 또는 B가 있으면 메서드가 호출됩니다.

<Conditional("A"), Conditional("B")> 
Shared Sub DoIfAorB()

End Sub
[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

AND 연산자를 사용하여 기호를 논리적으로 연결하려면 순차적인 조건부 메서드를 정의할 수 있습니다. 예를 들어, 아래의 두 번째 메서드는 A와 B가 모두 정의되어 있는 경우에만 실행됩니다.

<Conditional("A")> 
Shared Sub DoIfA()
    DoIfAandB()
End Sub

<Conditional("B")> 
Shared Sub DoIfAandB()
    ' Code to execute when both A and B are defined... 
End Sub
[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}

특성 클래스와 함께 Conditional 사용

Conditional 특성은 특성 클래스 정의에도 적용할 수 있습니다. 이 예제에서 사용자 지정 특성 Documentation은 DEBUG가 정의되어 있는 경우에만 메타데이터에 정보를 추가합니다.

<Conditional("DEBUG")> 
Public Class Documentation
    Inherits System.Attribute
    Private text As String 
    Sub New(ByVal doc_text As String)
        text = doc_text
    End Sub 
End Class 

Class SampleClass
    ' This attribute will only be included if DEBUG is defined.
    <Documentation("This method displays an integer.")> 
    Shared Sub DoWork(ByVal i As Integer)
        System.Console.WriteLine(i)
    End Sub 
End Class
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
    string text;

    public Documentation(string text)
    {
        this.text = text;
    }
}

class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}

호출자 정보 특성

호출자 정보 특성을 사용 하면 메서드 호출자에 대 한 정보를 얻을 수 있습니다. 호출자의 멤버 이름과 소스 코드의 줄 번호, 소스 코드의 경로 얻을 수 있습니다.

멤버가 호출자에 게 정보를 얻을 수에 선택적 매개 변수가 적용 되는 특성을 사용 합니다. 각 선택적 매개 변수에 기본값을 지정합니다. 다음 표에서 정의 된 호출자 정보 특성은 System.Runtime.CompilerServices 네임 스페이스:

특성

설명

형식

CallerFilePathAttribute

호출자가 포함 된 소스 파일의 전체 경로입니다. 컴파일 타임에 경로입니다.

String

CallerLineNumberAttribute

메서드를 호출 하는 소스 파일의 줄 번호입니다.

Integer

CallerMemberNameAttribute

메서드 이름 또는 호출자의 속성 이름입니다. 자세한 내용은 호출자 정보(C# 및 Visual Basic)를 참조하십시오.

String

호출자 정보 특성에 대 한 자세한 내용은 참조 하십시오. 호출자 정보(C# 및 Visual Basic).

Visual Basic 특성

다음 표에서는 Visual Basic과 관련된 특성을 나열합니다.

특성

목적

ComClassAttribute

클래스가 COM 개체로 노출되어야 함을 컴파일러에 알립니다.

HideModuleNameAttribute

모듈에 필요한 한정만 사용하여 모듈 멤버에 액세스할 수 있도록 합니다.

VBFixedStringAttribute

구조에서 파일 입력 및 출력 함수에 사용할 고정 길이 문자열의 크기를 지정합니다.

VBFixedArrayAttribute

구조에서 파일 입력 및 출력 함수에 사용할 고정 배열의 크기를 지정합니다.

COMClassAttribute

COMClassAttribute를 사용하면 Visual Basic에서 COM 구성 요소를 만드는 프로세스가 간소화됩니다. COM 개체는 .NET Framework 어셈블리와는 완전히 다르며, COMClassAttribute가 없을 경우 여러 단계를 거쳐야 Visual Basic에서 COM 개체를 생성할 수 있습니다. COMClassAttribute로 표시된 클래스의 경우 컴파일러에서 이러한 여러 단계를 자동으로 수행합니다.

HideModuleNameAttribute

HideModuleNameAttribute를 사용하면 모듈에 필요한 한정만 사용하여 모듈 멤버에 액세스할 수 있습니다.

VBFixedStringAttribute

VBFixedStringAttribute를 사용하면 Visual Basic에서 고정 길이 문자열을 만들도록 할 수 있습니다. 문자열은 기본적으로 가변 길이이며, 이 특성은 문자열을 파일에 저장할 때 유용합니다. 다음 코드에서는 이 작업에 대해 설명합니다.

Structure Worker
    ' The runtime uses VBFixedString to determine  
    ' if the field should be written out as a fixed size.
    <VBFixedString(10)> Public LastName As String
    <VBFixedString(7)> Public Title As String
    <VBFixedString(2)> Public Rank As String 
End Structure

VBFixedArrayAttribute

VBFixedArrayAttribute를 사용하면 고정된 크기의 배열을 선언할 수 있습니다. 배열은 Visual Basic 문자열처럼 기본적으로 가변 길이입니다. 이 특성은 데이터를 serialize하거나 파일에 쓸 때 유용합니다.

참고 항목

참조

리플렉션(C# 및 Visual Basic)

리플렉션을 사용하여 특성 액세스(C# 및 Visual Basic)

System.Reflection

Attribute

개념

C# 프로그래밍 가이드

기타 리소스

Visual Basic 프로그래밍 가이드

특성을 사용하여 메타데이터 확장