Re[6]: Как узнать имя функции?
От: Lloyd Россия  
Дата: 02.03.09 11:42
Оценка:
Здравствуйте, _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)
Re[2]: Как узнать имя функции?
От: overt Ниоткуда  
Дата: 04.03.09 10:57
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Если требуется логирование многих разных по сути и природе методов, то хардкодить это в тело самих методов — очень плохая идея.


А чем она плоха? Имя метода подставляется во время сборки и никаких дополнительных расходов при выполнении. Конечно приходится писать строчку кода для каждого метода, зато дешево и сердито.
(MS VS 7.1/8.0)
Re[3]: Как узнать имя функции?
От: _FRED_ Черногория
Дата: 04.03.09 14:24
Оценка:
Здравствуйте, overt, Вы писали:

_FR>>Если требуется логирование многих разных по сути и природе методов, то хардкодить это в тело самих методов — очень плохая идея.


O>А чем она плоха? Имя метода подставляется во время сборки и никаких дополнительных расходов при выполнении. Конечно приходится писать строчку кода для каждого метода, зато дешево и сердито.


Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как узнать имя функции?
От: rg45 СССР  
Дата: 04.03.09 14:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пока сделал так (только начал изучать C#, поэтому возможно криво):

А>...

Для этой цели не нужно получение стек трейса — достаточно получения стек фрейма вызывающей функции:
static void TraceToConsole(string reportText)
{
  MethodBase method = new StackFrame(1).GetMethod(); //Получение фрейма вызывающей функции
  Console.WriteLine("{0}(): {1}", method.Name, reportText);
}
--
Справедливость выше закона. А человечность выше справедливости.
Re: Как узнать имя функции?
От: Volgaboatman  
Дата: 05.03.09 09:27
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>В С++ я мог использовать макрос __FUNCTION__, например для логера, а как это делается в C# ?


Оно конечно немного не в тему вопроса, но если именно для целей логгера — то взять PostSharp (www.PostSharp.org) и сделать логгирование на атрибутах.
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[4]: Как узнать имя функции?
От: overt Ниоткуда  
Дата: 05.03.09 11:16
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.


Как дело обстоит в C# — без понятия, видимо подобного макроса просто нет, но в С++ __FUNCTION__ автоматически раскрывается в полное имя (т.е. вместе с именем класса, если используется в методе класса). Что касательно copy-paste, это не совсем верно, т.к. вызов ф-ии логирования можно элегантно завернуть в макрос, это дает определенную гибкость. Для С++ другого способа даже и не знаю.
(MS VS 7.1/8.0)
Re[5]: Как узнать имя функции?
От: _FRED_ Черногория
Дата: 05.03.09 14:01
Оценка:
Здравствуйте, overt, Вы писали:

_FR>>Не гибко: если понадобится логировать, допустим, и имя класса вдобавок, или значения параметров, или ещё как в логе использовать контекст вызова, который не ограничивается лишь именем. Придётся менять все вызовы. Так же дублирование логики во многих местах рано или поздно приведёт, с большой долей вероятности, к ошибкам, это же по сути copy-paste.


O>Как дело обстоит в C# — без понятия, видимо подобного макроса просто нет, но в С++ __FUNCTION__ автоматически раскрывается в полное имя (т.е. вместе с именем класса, если используется в методе класса).


Это делает компилятор. Компилятор C# такого не делает именно потому, что желаемого эффекта надо достигать другими, лучшими, путями.

O>Что касательно copy-paste, это не совсем верно, т.к. вызов ф-ии логирования можно элегантно завернуть в макрос, это дает определенную гибкость.


И накопипэстить его везде, где только можно. А если потом придётся что-то поменять в макросе, то, опять же, обработать все исходники

O>Для С++ другого способа даже и не знаю.


Аспектов и для плюсов полно (здесь).
Help will always be given at Hogwarts to those who ask for it.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.