每个.NET开发都应掌握的C#特性(Attribute)知识点

上篇文章讲述了C#反射知识点,本文将介绍C#特性(Attribute)的知识点。C#特性(Attribute)是一种强大的元数据机制,用于为代码元素(如类、方法、属性等)添加信息,以影响它们的行为或提供额外的信息。本文将介绍C#特性每个.NET开发都应熟悉的知识点,希望对大家开发有一定的帮助。

1、特性的基本概念

公共语言运行时使你能够添加类似于关键字的描述性声明(称为特性),以便批注编程元素(如类型、字段、方法和属性),它是以方括号([])的形式附加到代码元素上,并可包含参数。特性的定义通常是通过创建一个继承自System.Attribute的自定义类来实现的。下面是一个简单的特性定义示例,是.NET默认创建最小api的官方示例:

  [HttpGet(Name = "GetWeatherForecast")]//特性public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}

以上特性是http的Get请求特性,对外的链接名称是GetWeatherForecast。

详解–>C#-特性(Attribute)

2、内置特性的示例

C#默认提供了一些内置特性,例如[Obsolete]、[Serializable]和[Conditional]等。这样以便.NET开发很方便处理基本特定的逻辑任务。

[Obsolete] 特性:[Obsolete]特性用于标记已过时的代码。它可以接受一个可选的消息参数,用于提供有关为何该代码已过时的信息。

[Serializable] 特性:[Serializable]特性用于标记一个类可以序列化,以便将对象转换为字节流。例如:

[Serializable]
public class SerializableClass
{// 类的成员
}

3、自定义特性

当然大家也可以自定义特性,以满足项目的特定需求。通常自定义特征需要继承Attribute类,并在类上面加AttributeUsage特性,然后在这下面处理需要的逻辑,具体看之前我的一篇自定义特性的文章.NET特性(Attribute)简单自定义。下面是自定义了一个显示作者等信息的特性。

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class AuthorInfoAttribute : Attribute
{public string Author { get; }public string Version { get; }public AuthorInfoAttribute(string author, string version){Author = author;Version = version;}
}
//使用特性
[AuthorInfo("DotNet开发跳槽", "1.0")]
public class MyAwesomeClass
{// 类的成员
}

4、特性的应用场景

那么特性通常用在什么地方呢?

特性在.NET生态系统中有多种应用场景,比如代码文档的生成;代码分析和验证,比如属性的Name字段长度验证等;可以依赖注入;最最重要的是可以实现AOP(面向切面编程),比如可以用于日志记录和性能监控等。

5、 特性的运行时和编译时用法

特性在C#中既具有运行时用途,通过反射机制可以在程序运行时动态检查和操作已应用特性的代码元素,又具有编译时用途,可在编译时影响编译器的行为,例如条件编译、代码生成和静态分析,从而为开发者提供了在代码的不同阶段(编译和运行时)对代码进行元数据标记和定制的灵活性和功能。

6、特性的属性访问

通过反射,您可以访问已应用于代码元素的特性及其参数。在上篇介绍反射(C#反射知识点)的文章已经有所介绍。下面演示如何检查并获取类上的自定义特性信息。

Type type = typeof(MyAwesomeClass);
var attributes = type.GetCustomAttributes(typeof(AuthorInfoAttribute), false);
if (attributes.Length > 0 && attributes[0] is AuthorInfoAttribute authorInfo)
{Console.WriteLine($"作者: {authorInfo.Author}, 版本号: {authorInfo.Version}");
}
//上面的代码将打印MyAwesomeClass类的特性,展示出特性属性的作者和版本号。

结语

本文讲述了C#特性的一些知识点,比如自定义特性、内置特性、获取特性内容等,这些知识点都是.NET开发应该掌握的。

希望本文提供的C#特性知识对每个.NET开发者都有所帮助,对于C#特性的知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官网:

learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/attributes

2、AI查询

**推荐阅读

1、.NET无处不在的特性(Attribute)1-探究

2、.NET无处不在的特性(Attribute)2-简单自定义

3、面试必备:聊聊C#特性(Attribute)

来源公众号:DotNet开发跳槽  

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

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

相关文章

RFID系统简介:优点、应用与发展前景

一、介绍RFID系统 RFID系统全称是Radio Frequency Identification&#xff0c;是一种通过电磁场自动识别标记&#xff08;Tag或RFID标签&#xff09;并读取相关数据的技术。与条形码技术相比&#xff0c;RFID系统最大的特点就是可以自动识别、无须接触扫描&#xff0c;并且可以…

gin实现event stream

event stream是属于http的一种通信方式&#xff0c;可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接&#xff0c;服务端持续返回结果给客户端。相比较于websocket有如下区别&#xff1a; 基于http的通信方式&#xff0c;在各类框架的加持下不需要开发人员自己…

Explainability for Large Language Models: A Survey

本文是LLM系列文章&#xff0c;针对《Explainability for Large Language Models: A Survey》的翻译。 大型语言模型的可解释性:综述 摘要1 引言2 LLM的训练范式3 传统微调范式的解释4 提示范式的解释5 评估的解释6 研究挑战7 结论 摘要 大型语言模型(llm)在自然语言处理方面…

【Leetcode Sheet】Weekly Practice 10

Leetcode Test 123 买卖股票的最佳时机Ⅲ(10.3) 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意&#xff1a;**你不能同时参与多笔交易&#xff08;你必须在再次购…

简单对比一下 C 与 Go 两种语言

使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言&#xff0c;追溯其历史大部分源自编程语言 C。所以&#xff0c;任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易&#xff0c;同时避免了 C 编程语言的…

阶段五-Day03-Ajax

一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…

第十二章:泛型(Generic)

1&#xff1a;为什么要有泛型&#xff1f; 泛型&#xff1a;&#xff08;标签&#xff09;允许在定义类、接口时候通过一个标识来表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型、参数将在使用时&#xff08;例如&#xff1a;继承或实现这个接口&#xff0…

QML 带框最大化显示方法

1.QML窗口最大化很多会给出如下方法: visibility: "FullScreen" 此方法不好的方面是没有最大化&#xff0c;最小化&#xff0c;关闭按钮 2.通过showMaximized() 方法可以满足我们需求:在onCompleted 方法中执行 实现的效果如下:

QT基础入门——界面布局和常用控件(四)

前言&#xff1a; 所谓 GUI 界面&#xff0c;归根结底&#xff0c;就是一堆组件的叠加。我们创建一个窗口&#xff0c;把按钮放上面&#xff0c;把图标放上面&#xff0c;这样就成了一个界面。在放置时&#xff0c;组件的位置尤其重要。我们必须要指定组件放在哪里&#xff0c…

妙鸭相机功能代码复现

妙鸭相机功能代码复现 妙鸭相机主要实现人脸替换与人脸高清增强修复功能。可通过两种方式实现Roop和Lora模型。 RooP笔记 基础模型:inswapper_128.onnx 人脸分析模型:insightface 高清增强模型:gfpgan 大体流程为通过insightface检测出人脸,替换人脸,使用gfpgan对人…

设计模式——14. 观察者模式

1. 说明 观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含…

改变世界-生成式人工智能

麦肯锡在其《生成人工智能的经济潜力&#xff1a;下一个生产力前沿》中声称&#xff0c;“ChatGPT、GitHub Copilot、Stable Diffusion 等生成式人工智能应用程序以 AlphaGo 没有的方式吸引了世界各地人们的想象力&#xff0c;这要归功于它们广泛的实用性——几乎任何人都可以使…

Java中的Iterator

Java中的Iterator Iterator 是Java中的一个接口&#xff0c;它提供了一种访问集合&#xff08;如列表、集合等&#xff09;中元素的标准方式。Iterator 具有一些特点、优点和缺点&#xff0c;下面详细介绍如何使用它以及相关信息。 使用Iterator&#xff1a; 创建Iterator&am…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#xff0c;需包含用户登录&#xff0c;用户删除&#xff0c;用户查询功能&#xff0c;并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口&#xff0c;规定必须完成用户登录&#xff0c;用户删除&#xff0c…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

华为OD七日集训第7期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第7期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结 大家好&a…

基于Stable Diffusion的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…

【C++】Stack Queue -- 详解

一、stack的介绍和使用 1、stack的介绍 https://cplusplus.com/reference/stack/stack/?kwstack 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…

linux中命令行如何使用git

在Linux中&#xff0c;您可以使用命令行来使用Git版本控制系统。以下是一些常见的Git命令&#xff0c;用于在Linux终端中进行版本控制&#xff1a; 安装Git&#xff1a;如果您的Linux系统上还没有安装Git&#xff0c;可以使用适合您的包管理器来安装它。例如&#xff0c;在Ubu…