Здравствуйте, _FRED_, Вы писали:
_FR>Это не совсем то же, что получается при использовании класса StackTrace, но так же "то ещё мясо".
По сравнению со StackTrace-ом, GetCurrentMethod и не "мясо" совсем, а так себе "жиденькая подливочка". Разница почти на порядок.
using System;
using System.Diagnostics;
using System.Reflection;
class Program {
static void Main() {
const int STEPS = 1000000;
var sw = new Stopwatch();
sw.Reset();
sw.Start();
for (int i = 0; i < STEPS; i++){
TestGetCurrentMethod();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < STEPS; i++) {
TestStackTrace();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
public static void TestGetCurrentMethod() {
MethodBase.GetCurrentMethod();
}
public static void TestStackTrace() {
var trace = new StackTrace();
trace.GetFrame(0).GetMethod();
}
}
Результат:
2543
18629
Re[7]: Как узнать имя функции?
От:
Аноним
Дата:
02.03.09 11:54
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>По сравнению со StackTrace-ом, GetCurrentMethod и не "мясо" совсем, а так себе "жиденькая подливочка". Разница почти на порядок.
L>
L> public static void TestStackTrace() {
L> var trace = new StackTrace();
L> trace.GetFrame(0).GetMethod();
L> }
L>}
L>
Э нет, так нечестно!
Для равноценности надо так: new StackTrace(0)
Здравствуйте, _FRED_, Вы писали:
_FR>Если требуется логирование многих разных по сути и природе методов, то хардкодить это в тело самих методов — очень плохая идея.
А чем она плоха? Имя метода подставляется во время сборки и никаких дополнительных расходов при выполнении. Конечно приходится писать строчку кода для каждого метода, зато дешево и сердито.
Здравствуйте, overt, Вы писали:
_FR>>Если требуется логирование многих разных по сути и природе методов, то хардкодить это в тело самих методов — очень плохая идея.
O>А чем она плоха? Имя метода подставляется во время сборки и никаких дополнительных расходов при выполнении. Конечно приходится писать строчку кода для каждого метода, зато дешево и сердито.
Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.
Как дело обстоит в C# — без понятия, видимо подобного макроса просто нет, но в С++ __FUNCTION__ автоматически раскрывается в полное имя (т.е. вместе с именем класса, если используется в методе класса). Что касательно copy-paste, это не совсем верно, т.к. вызов ф-ии логирования можно элегантно завернуть в макрос, это дает определенную гибкость. Для С++ другого способа даже и не знаю.
Здравствуйте, overt, Вы писали:
_FR>>Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.
O>Как дело обстоит в C# — без понятия, видимо подобного макроса просто нет, но в С++ __FUNCTION__ автоматически раскрывается в полное имя (т.е. вместе с именем класса, если используется в методе класса).
Это делает компилятор. Компилятор C# такого не делает именно потому, что желаемого эффекта надо достигать другими, лучшими, путями.
O>Что касательно copy-paste, это не совсем верно, т.к. вызов ф-ии логирования можно элегантно завернуть в макрос, это дает определенную гибкость.
И накопипэстить его везде, где только можно. А если потом придётся что-то поменять в макросе, то, опять же, обработать все исходники
O>Для С++ другого способа даже и не знаю.