Вопрос

Есть ли у кого-нибудь хорошее решение для версии 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") ]

вместо этого, но у меня до этого не дошли руки.

Спасибо Джеффу Мэстри за его решение к этому.

К сожалению, в C # нет эквивалентной версии этого макроса. Я не считаю решение GetCurrentMethodName () эквивалентным макросу C ++ __FUNCTION__. А именно, потому что версия 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());

Обратной стороной его использования является то, что каждый раз, когда вы хотите напечатать имя вызывающего абонента, вам нужно перейти к функции ==> это отнимает много времени и снижает производительность!Итак, я использую его для отладки, и если мне нужно распечатать также рабочий код, я обычно встраиваю имя функции в журнал.Debug, например.:

s_log.Debug("CallerName");

ХТХ..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top