Информация об изменениях

Сообщение Re[2]: Логгинг с именами функций и номерами строк от 11.08.2017 8:37

Изменено 13.08.2017 12:15 VladD2

Re[2]: Логгинг с именами функций и номерами строк
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, BigBoss, Вы писали:


BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.

R>Почему не работают и что значит в лоб?

R>
  Скрытый текст
BB>>
BB>>    void LogMessage(string format, object[] args,
BB>>        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
BB>>        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
BB>>        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
BB>>    {
BB>>        string msg = string.Format(format, args);
BB>>        Console.WriteLine("{0} {1}:{2} '{3}'", sourceFilePath, memberName, sourceLineNumber, msg);
BB>>    }
BB>>



В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.

BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.


R>Вот здесь не понял


Запускаем, получаем

T:\varargs\Program.cs Main:48 'Hello, world'
T:\varargs\Program.cs world:49 'Hello, {0}'
world Hello:50 '{0}, {1}'



BB>>
BB>>    LogMessage("Hello, world");
BB>>    LogMessage("Hello, {0}", "world");
BB>>    LogMessage("{0}, {1}", "Hello", "world");
BB>>


R>Вот это у тебя вообще не скомпилируется


Да, я опустил прототип LogMessage без args[] и Format().

BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?


R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args


оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
Re[2]: Логгинг с именами функций и номерами строк
Здравствуйте, rameel, Вы писали:

BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.

R>Почему не работают и что значит в лоб?

BB>>
BB>>    void LogMessage(string format, object[] args,
BB>>        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
BB>>        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
BB>>        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
BB>>    {
BB>>        string msg = string.Format(format, args);
BB>>        Console.WriteLine("{0} {1}:{2} '{3}'", sourceFilePath, memberName, sourceLineNumber, msg);
BB>>    }
BB>>


В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.

BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.


R>Вот здесь не понял


Запускаем, получаем

T:\varargs\Program.cs Main:48 'Hello, world'
T:\varargs\Program.cs world:49 'Hello, {0}'
world Hello:50 '{0}, {1}'



BB>>
BB>>    LogMessage("Hello, world");
BB>>    LogMessage("Hello, {0}", "world");
BB>>    LogMessage("{0}, {1}", "Hello", "world");
BB>>


R>Вот это у тебя вообще не скомпилируется


Да, я опустил прототип LogMessage без args[] и Format().

BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?


R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args


оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел