program tip

C #! 조건부 속성?

radiobox 2020. 11. 27. 07:59
반응형

C #! 조건부 속성?


합니까 C #은이 하지 Conditional ( !Conditional, NotConditional, Conditional(!)) 속성을?


C #에 Conditional속성 이 있다는 것을 알고 있습니다 .

[Conditional("ShowDebugString")]
public static void ShowDebugString(string s)
{
   ...
}

1 은 다음과 같습니다 .

public static void ShowDebugString(string s)
{
#if ShowDebugString
   ...
#endif
}

그러나이 경우에는 반대 동작을 원합니다 (특히 옵트 아웃해야 함 ).

public static void ShowDebugString(string s)
{
#if !RemoveSDS
   ...
#endif
}

시도해 보도록 유도합니다.

[!Conditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

컴파일되지 않습니다. 과:

[Conditional("!RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

컴파일되지 않습니다. 과:

[NotConditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

그것은 단지 희망적인 생각이기 때문에 컴파일되지 않습니다.

1 사실은 아니지만 충분히 사실입니다. 내가 Nitpicker 's Corner를 다시 가져 오게하지 마십시오.


첫째, Conditional속성 을 갖는 것은 메소드 내부에있는 것과 동일 하지 않습니다#if . 중히 여기다:

ShowDebugString(MethodThatTakesAges());

의 실제 행동으로 ConditionalAttribute, MethodThatTakesAges전체 호출 - 호출되지 않습니다 인수 평가를 포함하여이 컴파일러에서 제거됩니다.

물론 다른 점은 메서드가 아닌 호출자 의 컴파일 타임에 컴파일 타임 전 처리기 기호에 의존한다는 것 입니다. :)

하지만 아니, 당신이 여기서 원하는 것을 할 수있는 것은 없다고 생각합니다. 조건부 메서드와 조건부 속성 클래스를 다루는 C # 사양 섹션을 방금 확인했는데 거기에 그러한 메커니즘이 있음을 암시하는 내용이 없습니다.


아니.

대신 다음과 같이 작성할 수 있습니다.

#if !ShowDebugString
[Conditional("FALSE")]
#endif

와 달리 [Conditional]호출자의 어셈블리가 아니라 어셈블리에있는 기호의 존재 여부에 따라 결정됩니다.


사실 우리는 ConditionalAttribute를 'NOT'할 수 없지만 아래에 제시된 조건을 'NOT'할 수 있습니다.

// at the begining of the code before uses
#if DUMMY
#undef NOT_DUMMY
#else
#define NOT_DUMMY
#endif

// somewhere in class
[Conditional("NOT_DUMMY")]
public static void ShowDebugStringNOTDUMMY(string s)
{
  Debug.Print("ShowDebugStringNOTDUMMY");
}


[Conditional("DUMMY")]
public static void ShowDebugStringDUMMY(string s)
{
  Debug.Print("ShowDebugStringDUMMY");
}

이것이 문제를 해결하는 데 도움이되기를 바랍니다.)


내 2 센트 만 더하면 3 년이 지나면 :-) ... 나는 반대를 확인 [Conditional("DEBUG")]하는 IsDebugMode속성을 설정하는 방법을 사용합니다 . Hacky이지만 작동합니다.

private bool _isDebugMode = false;
public bool IsDebugMode
{
    get
    {
        CheckDebugMode();
        return _isDebugMode;
    }
}

[Conditional("DEBUG")]
private void CheckDebugMode()
{
    _isDebugMode = true;
}

private void DisplaySplashScreen()
{
    if (IsDebugMode) return;

    var splashScreenViewModel = new SplashScreenVM(500)
    {
        Header = "MyCompany Deals",
        Title = "Main Menu Test",
        LoadingMessage = "Creating Repositories...",
        VersionString = string.Format("v{0}.{1}.{2}",
            GlobalInfo.Version_Major, GlobalInfo.Version_Minor, GlobalInfo.Version_Build)
    };

    SplashScreenFactory.CreateSplashScreen(splashScreenViewModel);
}

#ifndef ShowDebugString
#define RemoveSDS
#endif

?

편집 : 자세한 설명을 위해. ShowDebugString이 정의 Conditional["ShowDebugString"]되면 호출됩니다. ShowDebugString이 정의되지 않은 경우 Conditional["RemoveSDS"]호출됩니다.


NET 프레임 워크 표준 라이브러리 주석 참조는 어떤을 명시하지 않습니다. 그래서 나는 당신이 직접 굴려야 할 것이 두렵습니다!

참고 URL : https://stackoverflow.com/questions/8230191/c-sharp-conditional-attribute

반응형