使用其简单只需要声明一个参数,然后把这些Attribute加在参数前面,在函数中取到的参数值就是我们想要的结果。一个简单的例子如下:
static void Caller() { Called(); } static void Called( [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) { Console.WriteLine(memberName); Console.WriteLine(sourceFilePath); Console.WriteLine(sourceLineNumber); }输出如下:
Main
C:\Users\...\ConsoleApplication1\Program.cs
31
还算是简单方便,尤其对于输出日志来说。
C#5.0还对Lambda捕获闭包外变量进行了一些小优化,这个在之前文章介绍Lambda时有介绍,这里不再赘述。
C++ 调用方法信息
在C中就有宏来完成类似的功能。由于C++可以兼容C,所以在C++11之前,一般都用这种C兼容的方式来获得被调用方法的信息。新版的C++对此进行了标准化,增加了一个名为__func__的宏来完成这个功能。
需要注意的是和C#中类似功能获得调用方法名称不同,这个__func__宏得到的是被调用方法,即__func__所在方法的名称。个人感觉C++中__func__更实用。仍然是一个简单的例子:
void Called() { std::cout << __func__ << std::endl; } void Caller() { Called(); }调用Caller()将输出"Called"。
C++中实现这个宏的方式就是在编译过程中在每个方法体的最前面插入如下代码:
static const char* __func__ = "Called";了解这个之后你会感觉这个宏没有那么神秘了。
除了新被标准化的__func__在大部分C++编译器中仍然可以使用__LINE__和__FILE__获取当前行号和所在文件。
预告
下篇文章将介绍C#6带来的新特性,C#6中没有什么重量级的改进(据说编译器好像有很大改动,那个不了解就不说了,不是一般用户能仔细研究的。编译前端和编译后端发展这么多年复杂程度接近操作系统了),大都是一些语法糖,而且糖的数量还不少。欢迎继续关注。
本文断断续续写了很久,中间还出去玩了2周。有什么错误请指正。