C#特性-CallerMemberName、CallerFilePath和CallerLineNumber的介绍和应用

介绍

在csharp中,CallerMemberName, CallerFilePath, 和 CallerLineNumber 是编译时常量,它们是csharp 5.0引入的特性,用于提供有关调用堆栈的信息,通常用于日志记录和调试。这些特性可以自动填充方法的参数,无需显式传递信息。

所属命名空间:

System.Runtime.CompilerServices

所属程序集:

System.Runtime.dll

CallerMemberName

定义

CallerMemberNameAttribute 类

允许获取方法调用方的方法或属性名称。

[System.AttributeUsage(System.AttributeTargets.Parameter, Inherited=false)]
public sealed class CallerFilePathAttribute : Attribute

作用

CallerMemberName 提供调用方成员的名称(方法或属性)。

使用效果

调用位置CallerMemberName获取的成员名称结果
方法、属性或事件方法,属性或事件的名称
构造函数字符串 “.ctor”
静态构造函数字符串 “.cctor”
析构函数该字符串 “Finalize”
用户定义的运算符或转换生成的名称成员,例如, “op_Addition”。
特性构造函数特性所应用的成员的名称

使用示例

定义一个方法加上一个默认参数,增加CallerMemberName特性

 public void Work([CallerMemberName] string memberName = ""){Console.WriteLine("CallerMemberName:" + memberName);}

在方法中调用:

   void Playing(){Work();}

在这里插入图片描述

在构造函数中调用:

     internal class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");TestClass testClass = new TestClass();// testClass.Playing();Console.ReadKey();}}class TestClass{public TestClass(){Work();}public void Playing(){Work();}public void Work([CallerMemberName] string memberName = ""){Console.WriteLine("CallerMemberName:" + memberName);}}

在这里插入图片描述

CallerFilePath

定义

CallerFilePathAttribute 类

允许获取包含调用方的源文件的完整路径。 这是编译时的文件路径。

[System.AttributeUsage(System.AttributeTargets.Parameter, Inherited=false)]
public sealed class CallerFilePathAttribute : Attribute

作用

CallerFilePath 提供调用者的源文件路径。

使用示例:

定义一个方法加上一个默认参数,增加CallerFilePath 特性,调用时,会自动返回调用文件的完整路径

  class TestClass{public void Playing(){Work();}public void Work([CallerFilePath] string filePath = ""){Console.WriteLine("CallerFilePath:" + filePath);}}

在这里插入图片描述

CallerLineNumber

定义

CallerLineNumberAttribute 类

允许获取源文件中调用方法的行号。

[System.AttributeUsage(System.AttributeTargets.Parameter, Inherited=false)]
public sealed class CallerLineNumberAttribute : Attribute

作用

CallerLineNumber 提供调用者的源文件中的行号。

使用场景

CallerMemberNameCallerFilePathCallerLineNumber几个特性必须用于具有默认值的可选参数。 必须为可选参数指定显式默认值。 不能将特性用于未指定为可选的参数。

1.MVVM模式

在绑定数据时实现 INotifyPropertyChanged 接口。 此接口允许对象的属性通知绑定控件该属性已更改,以便此控件能够显示更新的信息。 如果没有 CallerMemberName 特性,则必须将属性名称指定为文本。

public class ViewModelBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged([CallerMemberName]string propertyName = ""){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}

如果不加[CallerMemberName],每次调用OnPropertyChanged时,都要加上对应属性

在这里插入图片描述

加了[CallerMemberName],只需要直接调用OnPropertyChanged();无需再一一传参数。

 public class MainWindowViewModel : ViewModelBase{private string _name;private string _mySelectedItem;private string _status;public string Name{get{return _name;}set{_name = value;OnPropertyChanged();}}public string MySelectedItem{get{return _mySelectedItem;}set{_mySelectedItem = value;OnPropertyChanged();}}public string Status{get{return _status;}set{_status = value;OnPropertyChanged();}}}

在这里插入图片描述

2.日志

在日志记录中包含调用该方法的信息,用于调试和调用记录,创建一个打印日志的方法,加上上面这些标签,然后只要在需要打印的地方调用,即可打印,使用时把`。

       public void Log(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){//打印日志Console.WriteLine("------------------------");Console.WriteLine("Message:" + message);Console.WriteLine("MemberName:" + memberName);Console.WriteLine("FilePath:" + sourceFilePath);Console.WriteLine("LineNumber:" + sourceLineNumber);Console.WriteLine("------------------------");}

完整代码示例:

    internal class Program{static void Main(string[] args){TestClass testClass = new TestClass();testClass.Log("主函数执行开始");Console.WriteLine("Hello, World!");testClass.Playing();testClass.Log("主函数执行结束");Console.ReadKey();}}class TestClass{public void Playing(){Log("执行play");}public void Log(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){//打印日志Console.WriteLine("------------------------");Console.WriteLine("Message:" + message);Console.WriteLine("MemberName:" + memberName);Console.WriteLine("FilePath:" + sourceFilePath);Console.WriteLine("LineNumber:" + sourceLineNumber);Console.WriteLine("------------------------");}}

效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考初级网络管理员__网络单选题

1.观察交换机状态指示灯初步判断交换机故障,交换机运行中指示灯显示红色表示()。 警告 正常 待机 繁忙 2.通常测试网络连通性采用的命令是()。 Netstat Ping Msconfig Cmd 3.一台16端口的交换机可以产生()个冲突域? 1 4 15 16…

jQuery 常用函数解析

简介 jQuery 是一个流行的 JavaScript 库,它极大地简化了网页开发中的常见任务。在本文中,我们将深入探讨 jQuery 中一些非常有用的函数,包括 parent、find、siblings、prop、hasClass、removeClass、addClass、empty、append、text、val、r…

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势,包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…

3D元宇宙虚拟主播引领文旅产业迈向更加美好的未来!

随着文旅产业的蓬勃发展,3D数字代言人的应用正逐渐改变着传统的文旅传播方式。文旅3D数字代言人搭建编辑器的出现,正是满足大部分文旅产业借助数字人浪潮,将传统文化与现代科技完美融合的创新之举。 文旅3D数字代言人搭建编辑器不仅满足了Z世…

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation(Sigir2024) 摘要 顺序推荐通过对用户的时间和顺序交互模式进行建模,有效地解决信息过载问题。 为了克服监督信号的局限性,最近的方法在推荐系统中…

奇安信齐向东:AI驱动安全,应对数字经济时代挑战

随着数字经济的蓬勃发展,网络安全问题日益凸显,AI技术的融入为网络安全带来了新的机遇和挑战。近日,备受瞩目的2024全球数字经济大会数字安全高层论坛暨北京网络安全大会战略峰会(简称“BCS大会”)在北京盛大开幕。本次…

GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码

知识星球🔗除了包含技术干货:《Java代码审计》《Web安全》《应急响应》《护网资料库》《网安面试指南》还包含了安全中常见的售前护网案例、售前方案、ppt等,同时也有面向学生的网络安全面试、护网面试等。 我们来看一下市面上常见的图形验证…

3、双分支判断 - 课件

一、双分支的基本语法结构 双分支结构,也称为if-else语句,其基本语法如下: if (判断表达式) {// 条件为真时执行的代码块 } else {// 条件为假时执行的代码块 }说明: 判断表达式是一个布尔表达式,它的值为真(true)或假(false)。如果判断表达式的值为真,执行if后面的代码块;如…

Redis:原理、概念、用法与实例解析

Redis:原理、概念、用法与实例解析 在当今风起云涌的技术领域中,Redis 犹如一颗璀璨的明星,闪耀着独特的光芒。它作为一种备受瞩目的数据存储和缓存解决方案,以其卓越的性能、丰富多样的功能以及简单易用的特性,成为了…

【WEEK16】学习目标及总结【Spring Boot】【中文版】

学习目标: 学习SpringBoot 学习内容: 参考视频教程【狂神说Java】SpringBoot最新教程IDEA版通俗易懂Dubbo和Zookeeper集成 学习时间及产出: 第十六周TUE~FRI 2024.6.11【WEEK16】 【DAY2】Dubbo和Zookeeper集成第二部分【中文版】【WEEK16…

3秒生成!这个AI模型画风也太治愈了,新手也能轻松驾驭

还在为不会画画而苦恼吗?别担心,今天给大家介绍一个超好用的AI模型——Soft and Squishy Linework,即使是小白也能轻松生成可爱的动漫图像! Soft and Squishy Linework:专门生成柔和的、低保真(lofi&#…

AWS 批量添加安全组

定义内网ip列表池 cat ip_list.txt192.168.1.1 192.168.1.2定义脚本安全组id等元数据 # cat sg-add.sh #!/bin/bash# 定义安全组ID-宁夏 VPC:NX-NHRY-PRD-VPC vpc-xxx SECURITY_GROUP_ID"sg-0f08237289xxxxx"# 从文件中读取IP地址到数组 IFS read -ra INTERNAL_IP…

为何选择Xinstall?告别邀请码,让App推广更便捷!

在互联网日益繁荣的今天,App的推广和运营成为了各大企业关注的重点。然而,传统的推广方式如邀请码限制,往往会给用户带来不便,同时也限制了App的快速增长。在这个背景下,Xinstall凭借其独特的功能和服务,成…

快慢指针技巧

快慢指针技巧 在说快慢指针之前,我们先说一下双指针。 双指针 双指针:使用两个指针来解决问题。 所谓的指针其实就是指数组的下标,或者链表的节点的地址。 我们以数组为例介绍一下。 有两个指针分别存储着数组的两个下标,这就…

成都某展厅2套2x2透明OLED拼接屏项目

成都某展厅的2套2x2透明OLED拼接屏展示设计具有独特的技术魅力和视觉效果。以下是关于这一展示设计的详细介绍: 1.产品规格 类型:透明OLED拼接屏 尺寸与配置:每套为2x2拼接,即每套由4块屏幕组成。 2.应用场景 成都某展厅&#…

200安时是如何计算的

200安时(200 Ah)是一个表示电池容量的单位,它表示电池在恒定电流下能够持续放电200小时,或者在不同电流下放电相应的小时数。"安时"是电池行业常用的单位,用来衡量电池存储电能的能力。 计算200安时电池能提…

什么是二叉树?二叉搜索树(BST)?什么是平衡二叉树,比如 AVL 树或红黑树?

二叉树及其变体详解 引言 在计算机科学中,树是一种重要的数据结构,用于表示具有层次结构的数据。二叉树作为树结构的一种特殊形式,因其简洁性和易于实现的特点,被广泛应用于各种算法和应用中。本文将详细介绍二叉树、二叉搜索树…

从0到1实现YOLOv3

只能跑跑官方代码,非官方代码训练py出现问题,我又不会改,想着还是要自己从零到一实现下模型,最慢的方法才是最快的方法。 目录 0.简介0.0 如何从零开始手写简介0.1 前提知识0.1.1 全卷积神经网络,Fully Convolutional Neural Network0.1.2 锚箱 Anchor Boxes0.1.3 做出预测…

HarmonyOS NEXT首个公测Beta版封包完成

华为将在6月21日至23日在深圳举办华为开发者大会2024。 根据华为消费者业务CEO余承东此前的预告,HarmonyOS NEXT将在大会上正式推出Beta版本,用户将有机会体验全新的鸿蒙系统。 HarmonyOS NEXT首个公测Beta版封包完成:Mate 60和Pura 70系列即…

从短期到长期,不同保存期限的红酒管理技巧

在葡萄酒的世界中,保存与管理的技巧对于确保葡萄酒的品质和口感至关重要。特别是对于云仓酒庄雷盛红酒,这种多类型红酒,更需要我们掌握一定的保存管理技巧。这篇文章将详细探讨从短期到长期,不同保存期限的云仓酒庄雷盛红酒的管理…