원문 : C# Conditional Method - http://dotnetperls.com

예전 C# 을 처음 배워갈때 누군가 물어 보았었다. C# 에서 조건부 컴파일이 가능하냐고?! 그때 난 "그런 건 없는것 같은데요..." 라고 대답했었다. -_-;;; 없긴 왜 없겠나!!



C# Conditional Method



C++ 에서는 #define 전처리기를 이용하여 조건부로 컴파일 되는 코드를 작성했다. C# 에서도 이와 같은 기법이 존재한다. C# 에서는 conditional method 라고 한다. conditional method 는 #define 정의된 심벌을 포함하고 있을때만 컴파일 된다.

conditional method 를 사용하기 위해 Conditional 어트리 뷰트를 사용해야 한다. Conditional 어트리뷰트는 문자열로 매개변수를 받는다. #define 에 정의한 문자열을 이곳에 사용한다.


Using the Conditional attribute

예제를 보면 쉽게 이해할 수 있다.
#define PERLS
#undef DOT


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConditionalMethodDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MethodA();
            MethodB();
            Console.ReadKey();
        }

        [Conditional("PERLS")]
        private static void MethodA()
        {
            Console.WriteLine("Method A");
        }

        [Conditional("DOT")]
        private static void MethodB()
        {
            Console.WriteLine("Method B");
        }
    }
}


Conditional 어트리뷰트를 사용하기 위해 Using.System.Diagnostics 네임스페이스를 using 시킨다.
using System.Diagnostics;

우선 코드의 제일 윗 부분에 conditional method 를 위해 Conditional 어트리뷰트에 사용할 기호를 정의한다.
#undef 를 사용하면 해당 심벌이 정의되지 않은 상태로 만든다.
#define PERLS
#undef DOT

conditional method 윗 부분에 Conditional 어트리 뷰트를 선언한다.
    [Conditional("PERLS")]
    static void MethodA()
    {
        Console.WriteLine(true);
    }

    [Conditional("DOT")]
    static void MethodB()
    {
        Console.WriteLine(false);
    }

코드에 #define 으로 "PERLS" 가 실행되어 있으면 MethodA 가 실행되고, "DOT" 가 선언되어 있으면 MethodB 가 실행된다.
눈여겨 볼 것은 MethodA(), MethodB() 가 모두 코드에 있지만 #define 에 의해서 선별적으로 실행 된다는게 인상적이다.
실행 결과는 아래와 같다.





More conditional attribute information

리턴타입이 void 가 아닌 메소드에는 conditional 어트리뷰트를 사용할 수 없다. 이런 제약조건을 메소드의 인수를 이용해서 간접적으로 해결할 수 도 있다. 즉, 메소드 안에서 저장할 데이터를 파라미터에 저장시키는 것이다.
cf) DEBUG Array - http://www.dotnetperls
Posted by six605
,