C# 5.0 给我们带来了三个非常有用的编译器特性

CallerMemberName

CallerFilePath

CallerLineNumber

在C与C++中由下列字符帮助我们实现调试消息的文件行号

01.#define debug_msg printf("%s[%d]:",__FILE__,__LINE__);printf

在.NET 4中与其功能相等的是

new StackTrace(true).GetFrame(1).GetMethod().Name

(注意,是功能相等,但实现不同,.NET4中是运行时获取,而C#5.0 中应该是编译时指定,原因参考以下)

在C#5.0中我们可以用以下代码实现调试信息文件行号获取:

        public static void TraceMessage(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){Trace.WriteLine("message: " + message);Trace.WriteLine("member name: " + memberName);Trace.WriteLine("source file path: " + sourceFilePath);Trace.WriteLine("source line number: " + sourceLineNumber);}

用VS2012编译调试,便能看见文件,行号,调用者方法名称。

三个特性是.NET 4.5里面的,如果在.NET4中使用那么请定义一下特性:

namespace System.Runtime.CompilerServices
{[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]public class CallerMemberNameAttribute : Attribute { }[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]public class CallerFilePathAttribute : Attribute { }[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]public class CallerLineNumberAttribute : Attribute { }
}

为了编译时.NET4和.NET4.5兼容,可以用预处理指令增加编译条件,在4.5下编译以上代码。

关键点来了,在.NET4下定义以上属性后,用VS2010编译,无相关信息输出,

用VS2012重新编译,则会输出相关信息(注意实在.NET4下),说明这个特性是编译器特性。也就是说我们可以在VS2012里写.NET4项目时用以上特性。

转载于:https://www.cnblogs.com/binsys/archive/2013/04/11/3015776.html

C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用相关推荐

  1. 用.net4中的DynamicObject实现简单AOP

    在.net framework 4中有一个DynamicObject 类型,我们通过重写 TryInvokeMember 方法实现简单的AOP. 首先看类图: 看下面的代码: public class ...

  2. [转]使用 .NET Framework 2.0 在您的应用程序中支持证书

    NET 安全 使用 .NET Framework 2.0 在您的应用程序中支持证书 Dominick Baier 本文讨论: Windows 证书存储区 .NET 中的证书类 验证.SSL.Web 服 ...

  3. 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug

    0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如: #define memcpy(dst,src,n) \     __asm__("cld;rep;movs ...

  4. sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

    思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞,攻击者可利用该漏洞在受影响设备上远程执行代码. 攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来 ...

  5. Theano 中文文档 0.9 - 7.2.3 Theano中的导数

    7.2.3 Theano中的导数 译者:Python 文档协作翻译小组,原文:Derivatives in Theano. 本文以 CC BY-NC-SA 4.0 协议发布,转载请保留作者署名和文章出 ...

  6. C语言编程>第二十六周 ⑥ 请补充fun函数,该函数的功能是:按 “0”到 “9”统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。

    例题:请补充fun函数,该函数的功能是:按 "0"到 "9"统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中.注意:不能使用字符串库函数. ...

  7. matlab pi表示,在matlab绘图中,x=0:0.1:4*pi;此语句中,0,0.1,4*... MATLAB中,x=0:pi/100:2*pi;表示什么意思?...

    导航:网站首页 > 在matlab绘图中,x=0:0.1:4*pi;此语句中,0,0.1,4*... MATLAB中,x=0:pi/100:2*pi;表示什么意思? 在matlab绘图中,x=0 ...

  8. vue tree组件_基于 Vue2.0 和 HeyUI 组件库的中后端系统 HeyUI Admin

    介绍 heyui-admin 是一个成熟的企业应用解决方案,基于 vue2.0 和 heyui 组件库的中后端系统. 功能 - Js - common / 通用 - ajax / 封装axios - ...

  9. 《Adobe Illustrator CS5中文版经典教程》—第0课0.8节 在Illustrator CS5中置入Photoshop图像...

    本节书摘来自异步社区<Adobe Illustrator CS5中文版经典教程>一书中的第0课0.8节 在Illustrator CS5中置入Photoshop图像,作者[美]Adobe公 ...

最新文章

  1. 调驱动 一定注意 cache 表的
  2. 基于FPGA的OLED屏幕开发
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类
  4. VTK:Rendering之Cone3
  5. Scala中zip或者zipWithIndex的计数器用法
  6. 语言把数据写入csv文件_把JSON/CSV文件打造成MySQL数据库
  7. 关于csgo的观看录像fps低_CSGO:Ququ带队击败LQ豪取五连冠,8次MVP闪耀全场
  8. STM32-OLED显示
  9. sleep() wait() yield() join()
  10. Android 学习笔记--android基本
  11. 输入n个字符串字典序排序_30个Python奇淫技巧集
  12. mRNA的亚细胞定位
  13. rose服务器系统,Rose HA for windows
  14. paraview使用GUI连接服务器
  15. VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行
  16. 百练2706 麦森数
  17. 【渝粤题库】陕西师范大学200611 英语修辞 作业
  18. C++一本通题库1008
  19. 计算机系统基础作业数据的机器级表示与处理
  20. 腾讯云搭建Socks5一系列及相关内容

热门文章

  1. Java 集合框架(List、Set、Map、Iterator、Stack、Properties)
  2. LeetCode 1620. 网络信号最好的坐标
  3. LeetCode 696. 计数二进制子串
  4. c写成php的扩展_用C语言编写PHP扩展
  5. 【Python基础知识-pycharm版】第三节-列表
  6. PHP允许输入负数,php exec在linux中返回值不能为负数
  7. python中的下标索引
  8. 共同一作,会被认可吗?
  9. NLP史上最全预训练模型汇总
  10. 美团深度学习系统的工程实践