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…

安装 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秒生成!这个AI模型画风也太治愈了,新手也能轻松驾驭

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

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

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

快慢指针技巧

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

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

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

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

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

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

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

WPF/C#:如何将数据分组显示

WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下&#xff1a; MainWindow.xaml如下&#xff1a; <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…

Android-apk自动签名

一、创建apk签名 1、有得话忽略 Build->Generate Signed Bundle or APK&#xff0c;选择APK&#xff0c;然后Next&#xff0c;然后选择Create new 2、 2.在app/build.gradle中&#xff0c;在android{…}中添加以下内容 signingConfigs { release { storeFile file(androi…

Java实现俄罗斯方块-初始化游戏界面的JPanel

目录 技术实现&#xff1a; 2.初始化游戏界面&#xff1b; 2.1 什么是游戏界面 2.2 JPanel面板 2.3 流布局管理器【FlowLayout】 2.4 网络布局管理器 【GridLayout】 2.5 边界布局管理器 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff…

MySQL -- 事务

MySQL事务是数据库操作的一个重要概念&#xff0c;事务是指一组操作要么全部完成&#xff0c;要么全部不完成&#xff0c;是数据库的一个逻辑工作单元。事务的主要目的是确保数据库的一致性和可靠性。 事务是一组SQL语句的执行&#xff0c;要么全部成功&#xff0c;要么全部失…

企业该怎么进行流程管理?

众所周知&#xff0c;流程管理在企业中是一种有效的方法&#xff0c;可以帮助组织优化运营、提高效率并降低成本。 下面是一些步骤&#xff0c;可以帮助大家在企业中实施流程管理&#xff1a; 确定目标&#xff1a;首先&#xff0c;明确企业的目标和愿景。这将帮助您确定需要…

最佳 PDF 合并工具评测

PDF是我们官方文档常用的格式。因此&#xff0c;如今处理 PDF 文件是一项非常重要的技能&#xff0c;例如使用 doc 创建 pdf、将 pdf 文件合并为单个 pdf、将 pdf 拆分为多个 pdf 文件、为 pdf 文件添加密码以进行安全分发等等。获得上述技能的关键部分是找到一个简单但功能强大…

如何高效使用大型语言模型 LLMs 初学者版本 简单易上手

第一条也是最重要的一条规则是 永远不要要求LLM提供你无法自己验证的信息, 或让它完成你无法验证其正确性的任务。 唯一例外的情况是那些无关紧要的任务&#xff0c; 例如&#xff0c;让大型语言模型提供公寓装修灵感之类的是可以的 。 首先请看两个范例 不佳示范&#xff1a…

Qwen-VL图文多模态大模型LoRA微调指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…