Подтвердить что ты не робот

Версия С# макроса __FUNCTION__

Есть ли у кого-нибудь хорошее решение для С# версии макроса С++ __FUNCTION__? Компилятор, похоже, не нравится.

4b9b3361

Ответ 1

Попробуйте использовать это вместо этого.

System.Reflection.MethodBase.GetCurrentMethod().Name

С# не имеет макросов __LINE__ или __FUNCTION__, таких как С++, но есть эквиваленты

Ответ 2

В настоящее время я использую такую ​​функцию:

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") ]

вместо этого, но я не обошел это.

Благодаря Джеффу Мастри за его решение.

Ответ 3

К сожалению, нет эквивалентной версии этого макроса в С#. Я не считаю решение GetCurrentMethodName() эквивалентным макросу С++ __FUNCTION__. А именно, версия С++ - это вычисление времени компиляции имени. Для С# это расчет времени выполнения и приводит к поражению производительности.

Я не делаю никаких предположений о серьезности стоимости, но есть один

Ответ 4

Следующее должно работать, хотя оно будет оцениваться во время выполнения, а не во время компиляции.

System.Reflection.MethodBase.GetCurrentMethod().Name

Ответ 6

Я использую это:

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

Пример использования:

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

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

s_log.Debug("CallerName");

НТН..