전체 페이지뷰

2017년 1월 11일 수요일

C#, Attribute

Attribute는 클래스에 메타데이터를 직접 추가할 수 있도록 해 줍니다.
이렇게 부가 정보를 작성하는데 주석을 사용할 수도 있습니다.
그러나 주석은 전적으로 사람이 읽도록 만들어진 것이라면 애트리뷰트는 컴퓨터를 위한 것입니다.


예를 들어 다음 버전에 deprecated 처리 될 메소드의 앞에 덧붙여서 컴파일시 경고를 줄 수도 있고, 메소드나 속성에 대해 설명을 추가해 줄 수도 있습니다.

사용법

[ 애트리뷰트명(매개변수)]

와 같이 간단하게 사용됩니다. 어셈블리, 클래스, 모듈, 구조체, 열거형 변수, 생성자, 메소드, 프로퍼티, 필드, 이벤트, 인터페이스, 파라미터, 반환값, 델리게이트의 앞에 모두 사용 가능합니다.

간단한 예제로 사용법을 알아보겠습니다.

using System;
 
namespace AttributeExample
{    
    class MyClass
    {
        [Obsolete("2017년부터 OldMethod는 사용 중지됩니다. NewMethod를 이용하세요. ")]
        public void OldMethod()
        {
            Console.WriteLine("구버전");
        } 

    }
    class Program
    {       
        static void Main(string[] args)
        {
            MyClass mine = new MyClass();
            mine.OldMethod();    
        }
    }
}
cs

결과)
구버전


그러나 오류 목록을 보면 이런 경고가 뜹니다.



호출자 정보 애트리뷰트

C/C++에서 제공하던 __FILENAME__, __LINE__, __FUCTION__ 매크로에 해당하는 기능입니다. 이것을 이용해서 로그를 찍어보면 해당 이벤트가 어떤 경로, 어떤 행에서 일어났는지를 알 수 있습니다.

System.Runtime.CompilerServices 네임스페이스에 정의된 이 애트리뷰트는
CallerMemberNameAttribute
CallerFilePathAttribute
CallerLineNumberAttribute 의 세가지입니다.

예제로 사용 방법을 알아 보겠습니다.

using System;
using System.Runtime.CompilerServices;
 
namespace CallerInfo
{    
    public static class TraceMessage
    {
        public static void WriteLine(string message, 
            [CallerFilePath] string file="",
            [CallerLineNumber] int line=0,
            [CallerMemberName] string member = "")
        {
            Console.WriteLine("{0}(Line:{1}) {2} {3}", file, line, member, message);
        }
    }
    class Program
    {       
        static void Main(string[] args)
        {
            TraceMessage.WriteLine("Something happened!");
        }
    }
}
cs


결과)
C:\Users\user\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs(Line:20) Main Something happened!

Attribute의 아주 간단한 것들만 살펴 봤지만, 이쯤에서 모두들 예상하듯이 그 종류는 또 어마어마합니다. 필요한 것은 그때그때 살펴보는 것이 정신 건강에 이로울 듯 합니다.

댓글 없음:

댓글 쓰기