문제

C# 버전의 C# __function__ 매크로에 대한 좋은 솔루션이 있습니까? 컴파일러는 그것을 좋아하지 않는 것 같습니다.

도움이 되었습니까?

해결책

대신 이것을 사용해보십시오.

System.Reflection.MethodBase.GetCurrentMethod().Name

C#에는 없습니다 __LINE__ 또는 __FUNCTION__ C ++와 같은 매크로는 동등합니다

다른 팁

현재 사용하는 것은 다음과 같은 기능입니다.

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}

__function__가 필요할 때 대신 __function ()을 호출합니다. 예를 들어:

Debug.Assert(false, __Function() + ": Unhandled option");

물론이 솔루션은 반사를 사용하지만 내가 찾을 수있는 최상의 옵션입니다. 디버깅에만 사용하기 때문에 (릴리스 빌드에서 추적하지 않음) 성능 히트는 중요하지 않습니다.

내가해야 할 일은 디버그 함수를 만들고 태그를 지정하는 것입니다.

[ Conditional("Debug") ]

대신, 그러나 나는 그것에 대해 얻지 못했습니다.

Jeff Mastry에게 감사합니다 해결책 이에.

불행히도 C#에는 해당 매크로의 동등한 버전이 없습니다. 나는 c ++ __function__ 매크로와 동등한 getCurrentMethodName () 솔루션을 고려하지 않습니다. 즉 C ++ 버전은 이름의 컴파일 시간 계산입니다. C#의 경우 이것은 런타임 계산이며 성능이 히트됩니다.

비용의 심각성에 대해서는 가정하지는 않지만 하나가 있습니다.

컴파일 중 대신 런타임에 평가되지만 다음은 작동해야합니다.

System.Reflection.MethodBase.GetCurrentMethod().Name

.NET 4.5에 추가됩니다.

여기 @roken의 답변을 참조하십시오.

__line__ __file__ 등가물이 C#에 존재합니까?

나는 이것을 사용한다 :

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

사용 예 :

s_log.DebugFormat("{0}", CallerName());

사용의 아래쪽은 발신자 이름을 인쇄 할 때마다 함수 ==> 시간 소모 및 성능 히트로 점프해야한다는 것입니다! 따라서 Parpose Debugging에 사용하고 프로덕션 코드에도 인쇄 해야하는 경우 일반적으로 함수 이름을 log.debug, eg에 인라인으로 내려줍니다.

s_log.Debug("CallerName");

hth ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top