ITEM 4 : #if 대신에 Conditional Attributes를 사용해라

|

ITEM 4 : Use Conditional Attributes instead of #if.

                 (#if 대신에 Conditional Attributes를 사용해라)



■ Conditional Attributes의 요약 및 장점


1.      Conditional Attribute를 사용해서 빌드할 때 해당 메서드도 빌드가 되서 공간을 차지하게 된다. 하지만 참조만 되지 않으면 메모리로 올라가지 않는다.(#if는 빌드시에 빈공간으로 되므로 공간(disk space)은 차지하지 않는다.)


2.      실행되는 조건을 다중으로 제어 할 수있다.(DEBUG 모드, TRACE 모드등)


3.      Conditional Attribute를 사용한 메소드들은 모두 리턴타입이 void여야한다. 또한 매겨변수를 갖지 말아야 한다.(매개변수를 사용하면 부작용이 있을 수 있다)


4.      #if/#endif 블록을 쓰면 실수로 중요한 함수나 할당들이 삭제될 수 있다.


5.      Coditional Attirbute #if/#endif 블록보다 더 효율적인 IL(Intermediate Language)를 생성한다.


 ■ #if/#endif의 단점


1.      호출 되는 메소드의 내부에 #if/#endif가 있으면, RELEASE 모드에서는 해당 범위의 소스들이 없는 것으로 처리된다. DEBUG 모드나 RELEASE 에서 모두 호출이 되지만 RELEASE 모드에서는 빈 메서드를 호출하는 것이므로 의미 없는 호출에 아주 약간이 나마 부하가 걸리게 된다.


2.      DEBUG 모드에서는 이상이 없는 코드가 RELEASE 모드에서 이상이 발생 할 수있다. 아래에서는 msg가 빈 공백으로 표출이 된다

public void Func()
{
   string msg = null;

     #if DEBUG
      msg = GetDiagnostics();
    #endif

   Console.WriteLine(msg);
}

■ Terms



■ 해석이 모호하거나 중요한 구문


1.      You might not have encountered many library functions in this method.

(당신은 이 메소드에서 사용된 많은 라이브러리 함수들을 보지 못했을 것이다.)


2.      This is one example of why you need to understand the distinction made between the compilation and JIT steps in .NET.

       (이는 컴파일과 JIT 단계 사이의 차이점의 이해가 왜 필요한지에 대한 하나의 예이다.)


3.      That’s a practice you should follow.

       ( 그것은 당신이 반드시 따라야 할 관행이다.)


4.      That can lead to practices where an important side effect does not take place.

       ( 그것은 발생해서는 안되는 중요한 부작용을 야기한다.)


5.      The user could use a method call with side effects to generated those parameters.

       ( 사용자는 그러한 매개변수를 생성하는 부작용 메소드 호출을 사용할 수 있다.)



■ 단어


1.      respond : 대답하다,답장을 보내다/반응을 보이다.

2.      apply : 신청하다,지원하다/쓰다,적용하다

3.      compilation : 모음집/편집,편찬

4.      invariant : 변함없는

5.      subtle : 미묘한, 감지하기 힘든

6.      goof:바보 같은 실수를 하다.

7.      sprinkle:뿌리다.

8.      diagnose: 진단하다.

9.      instrument : 기구,도구/악기

10.    go over : ~을 점검하다/조사하다

11.    diagnostic:진단의(a)/진단(n)

12.    regardless of ~ : ~에 상관없이

13.    immaterial : 중요하지 않은/무형의,실체가 없는

14.    localize:(영항 등을) 국한 시키다

15.    pragma: A compiler directive

16.    practice:실행,실천/관행,관례/연습

17.    applicable : 해당[적용]되는/적당한/적절한


■ 피드백


  :비록 Conditional Attributes가 빌드되어서 공간을 차지하게 되더라도, 참조만 되지 않으면 메모리에 올라가지 않으므로

   #if를 써서 오류가 날 가능성이 있는 것 보다 더 좋은 선택인 것 같다.

   또한 Conditional Attributes는 #if보다 실행되는 조건을 다양하게 선택이 가능하므로 Contitional Attributes를 쓰자!.


And