Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

__line__ номер линии кода


Не первый раз приходится писать 

log1(613,"msg");
log1(614,"msg");


В с++ есть классная штука __LINE__ на www.cprogramming.com
и с++ ф-ция логирования
, есть ли простое решение для с# логирования именно строки, которая выполняется?
    


Ответы

Ответ 1



Легко! Нужно воспользоваться «магическим» атрибутом [CallerLineNumber], который заставляет компилятор подставить номер строки. Например, так: using System.Runtime.CompilerServices; static int GetLineNumber([CallerLineNumber] int line = -1) => line; Пример использования: class Program { static void Main(string[] args) { Console.WriteLine("Этот код находится в строке " + GetLineNumber()); } static int GetLineNumber([CallerLineNumber] int line = -1) => line; } В вашем случае я бы объявил функцию log1 так: void log1(string message, [CallerLineNumber] int line = -1) { if (line != -1) { ... } } и вызывал бы просто log1("msg"); Другие магические атрибуты: [CallerMemberName] (очень полезен для реализации INotifyPropertyChanged!) и [CallerFilePath].

Ответ 2



Т.к. для работы атрибутов [CallerLineNumber] нужен .Net 4, хочу заметить что ест и другие решения, среди которых рефлексия. Недостаток рефлексии - если решение не debug (нет отладочной информации) то не будет имени файла, и номера линии. Если есть обфускация - то этот метод вообще не имеет смысла. void log1(string message){ StackTrace st = new StackTrace(new StackFrame(true)); Console.WriteLine(" Stack trace for current level: {0}", st.ToString()); StackFrame sf = st.GetFrame(0); Console.WriteLine(" File: {0}", sf.GetFileName()); Console.WriteLine(" Method: {0}", sf.GetMethod().Name); Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber()); Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber()); // ... } Взято с en so

Комментариев нет:

Отправить комментарий