C#5.0新增功能02 调用方信息
通过使用调用方信息特性,可获取有关方法的调用方的信息。 可以获取源代码的文件路径、源代码中的行号和调用方的成员名称。 此信息有助于跟踪、调试和创建诊断工具。若要获取此信息,可以使用应用于可选参数的特性,每个特性都具有默认值。 下表列出在 System.Runtime.CompilerServices 命名空间中定义的调用方信息特性:
| 特性 | 描述 | 类型 |
|---|---|---|
| CallerFilePathAttribute | 包含调用方的源文件的完整路径。 这是编译时的文件路径。 | String |
| CallerLineNumberAttribute | 源文件中调用方法的行号。 | Integer |
| CallerMemberNameAttribute | 调用方的方法或属性名称。 请参阅本主题后面的成员名称。 | String |
示例
下面的示例演示如何使用调用方信息特性。 每次调用 TraceMessage 方法时,调用方信息将替换为可选参数的变量。
public void DoProcessing()
{
TraceMessage("Something happened.");
} public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = )
{
System.Diagnostics.Trace.WriteLine("message: " + message);
System.Diagnostics.Trace.WriteLine("member name: " + memberName);
System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
} // 输出结果:
// message: Something happened.
// member name: DoProcessing
// source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
// source line number: 31
备注
你必须为每个可选参数指定显式默认值。 不能将调用方信息特性应用于未指定为可选的参数。
调用方信息特性不会使参数成为可选参数。 相反,它们会在忽略此参数时影响传入的默认值。
在编译时,调用方信息值将作为文本传入中间语言 (IL)。 与异常的 StackTrace 属性的结果不同,这些结果不受模糊处理的影响。
你可显式提供可选参数来控制调用方信息或隐藏调用方信息。
成员名称
可以使用 CallerMemberName 特性来避免将成员名称指定为所调用的方法的 String 参数。 通过使用这种技术,可以避免“重命名重构”不更改 String 值的问题。 此好处对于以下任务特别有用:
使用跟踪和诊断例程。
在绑定数据时实现 INotifyPropertyChanged 接口。 此接口允许对象的属性通知绑定控件该属性已更改,以便此控件能够显示更新的信息。 如果没有
CallerMemberName特性,则必须将属性名称指定为文本。
以下图表显示在使用 CallerMemberName 特性时返回的成员名称。
| 调用发生中 | 成员名称结果 |
|---|---|
| 方法、属性或事件 | 从中发起调用的方法、属性或事件的名称。 |
| 构造函数 | 字符串“.ctor” |
| 静态构造函数 | 字符串“.cctor” |
| 析构函数 | 字符串“Finalize” |
| 用户定义的运算符或转换 | 为成员生成的名称,例如,“op_Addition”。 |
| 特性构造函数 | 要应用特性的方法或属性的名称。 如果该特性是成员中的任何元素(如参数、返回值或泛型参数),则此结果是与该元素关联的成员的名称。 |
| 无包含的成员(例如,程序集级别或应用于类型的特性) | 可选参数的默认值。 |
C#5.0新增功能02 调用方信息的更多相关文章
- C#4.0新增功能02 命名实参和可选实参
连载目录 [已更新最新开发文章,点击查看详细] C# 4 介绍命名实参和可选实参. 通过命名实参,你可以为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联. ...
- C#2.0新增功能02 泛型
连载目录 [已更新最新开发文章,点击查看详细] C# 语言和公共语言运行时 (CLR) 的 2.0 版本中添加了泛型. 泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有 ...
- C#3.0新增功能02 匿名类型
连载目录 [已更新最新开发文章,点击查看详细] 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用. 每 ...
- C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点 第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...
- C# 5.0中使用CallerMemberName、CallerFilePath和CallerLineNumber获取代码的调用方信息(转载)
很多时候,我们需要在运行过程中记录一些调测的日志信息,如下所示: public void DoProcessing() { TraceMessage("DoProcessing()被XXX调 ...
- C#2.0新增功能06 协变和逆变
连载目录 [已更新最新开发文章,点击查看详细] 在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. 以下代码演示分配兼容性.协 ...
- C#7.0 新增功能
连载目录 [已更新最新开发文章,点击查看详细] C# 7.0 向 C# 语言添加了许多新功能 01 out 变量 支持 out 参数的现有语法已在此版本中得到改进. 现在可以在方法调用的参数列表 ...
- C#基础拾遗系列之二:C#7.0新增功能点
第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...
- Android 7.0 新增功能和api
Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 请务必查阅 Android 7.0 行为变更以了解平台变更可能影响您的应用的领域. 要详细了解 A ...
随机推荐
- 80%的岗位是没有太多能力上的要求的(少部分聪明的人开始觉醒,这部分一定是那些主动追求、主动学习的人;30岁现象能区分真正专业和不学无术的人)good
不要沦陷程序员的30岁问题 热门> 就是学习能力和工作热情态度的问题. 我之前也跟作者一样思考过这个问题,答案是否定的. 在知识积累的行业,年纪越大,越吃香,比如金融,医学,IT.就怕3 ...
- linux 磁盘控件找到大文件
df -lh Used:已经使用的空间 Avail:可以使用的空间 Mounted on:挂载的目录 然后找到大文件 du是linux下用看查看磁盘的命令 下面我们先一个目录的来查看空间占用情况 du ...
- cloudsim 3.0.3下载与安装教程
1.配置jdk(之前的文章都讲解过,这里就不具体说了) 2.安装eclipse或MyEclipse 3.下载cloudsim压缩包,这个的官网是需要FQ,这里贴上我的下载地址 链接:https://p ...
- 浅入深出Vue:数据渲染
今天来正式开始 vue的学习,首当其冲的当然是数据的渲染.毕竟数据就是拿来看的,看看如果使用 vue来展示数据. 为什么渲染 俗话说 "人靠衣装马靠鞍", 那咱们的代码就是得靠 U ...
- Mybatis_One
Mabatis的概述 JavaEE开发是分层的:表现层 业务层 持久层 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用 ...
- happy machine learning(First One)
从前几天起我就开始了愉快的机器学习,这里记录一下学习笔记,我看的是吴恩达老师的视频,这篇博客将会按吴老师的教学目录来集合各优良文章,以及部分的我的个人总结 1. 监督学习与无监督学习 监督:给定一个 ...
- Java8新特性——lambda表达式.(案例:词频统计)
需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...
- 44 | 测试先行:测试驱动开发(TDD)
- Failed to start Docker Application Container Engine.
[root@dockertest ~]# systemctl status docker.service● docker.service - Docker Application Container ...
- 浅谈Linq查询
一.Var关键字 在学习Linq查询之前,我们先来学习var关键字的用法,看看微软官方的定义:从Visual C#3.0开始,在方法范围声明的变量可以具有隐式“类型” var.隐式类型的局部变量是强类 ...