C#中的Attribute详解(上)
C#中的Attribute详解(上)
- 一、Attribute是什么
- 二、Attribute的作用
- 三、Attribute与注释的区别
- 四、系统Attribute范例
- 1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多垃圾信息,而且不利于测试。注释区分法如下:
- 2、如果使用Attribute,区分这四类静态方法将会简单许多。当类Program和类ToolKit都在Program.cs文件中时,#define Buged只需要在Program.cs文件头部定义,示例代码如下:
- 五、系统Attribute范例分析
一、Attribute是什么
Attribute是一种可由用户自有定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标,修饰符(比如private、public、static、override、virtual等等)是C#语言本身的关键字。
简单地说,Attribute就是一种“附着物”——就像牡蛎吸附在船底或礁石上一样。
这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息保存在附着物的体内)——比如“这个类是我写的”或者“这个函数以前出过问题”等等。
二、Attribute的作用
Attribute的作用是为元数据添加内容。
元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。
三、Attribute与注释的区别
注释是对程序源代码的一种说明,主要目的是给人看的,在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行。
Attribute是程序代码的一部分,它不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里。在程序运行的时候,你随时可以从元数据中提取提取出这些附加信息,并以之决策程序的运行。
四、系统Attribute范例
在项目中,某个类由两个程序员(小张和小李)共同维护。这个类起到了“工具包”(Utilities)的作用,里面包含几十个静态方法,就像.Net Framework中的Math类一样。这些静态方法,一半是小张写的、一半是小李写的;在项目的测试中,有一些静态方法曾经出过bug,后来又被修正。
我们可以把这些方法分成这样几类:
我们分类的目的主要是在测试的时候可以按照不同的类别进行测试、获取不同的效果。比如:统计两个人的工作量或者对曾经出过bug的方法进行回归测试。
1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多垃圾信息,而且不利于测试。注释区分法如下:
public static void Li_Buged_FuncA(){ }
public static void Li_NoBug_FuncB(){ }
public static void Zhang_Buged_FuncC(){ }
public static void Zhang_NoBug_FuncD(){ }//或//Created by Li,Buged
public static void FuncA(){ }
//Created by Li,NoBug
public static void FuncB(){ }
//Created by Zhang,Buged
public static void FuncC(){ }
//Created by Zhang,NoBug
public static void FuncD(){ }
2、如果使用Attribute,区分这四类静态方法将会简单许多。当类Program和类ToolKit都在Program.cs文件中时,#define Buged只需要在Program.cs文件头部定义,示例代码如下:
#define Buged //C#的宏定义必须在所有代码之前。当前只让Buged宏有效
//#define NoBug
//#define Li
//#define Zhang
using System;
using System.Diagnostics;//注意:ConditionalAttribute特性包含在此命名空间中namespace AttributeTest
{class Program{static void Main(string[] args){ToolKit.FuncA();ToolKit.FuncB();ToolKit.FuncC();ToolKit.FuncD();Console.ReadKey();}}public class ToolKit{[ConditionalAttribute("Li")]//Attribute名称的长记法[ConditionalAttribute("Buged")]public static void FuncA(){Console.WriteLine("Created by Li, Buged");}[Conditional("Li")]//Attribute名称的短记法[Conditional("NoBug")]public static void FuncB(){Console.WriteLine("Created by Li, NoBug");}[Conditional("Zhang")][Conditional("Buged")]public static void FuncC(){Console.WriteLine("Created by Zhang, Buged");}[Conditional("Zhang")][Conditional("NoBug")]public static void FuncD(){Console.WriteLine("Created by Zhang, NoBug");}}
}
当类Program在Program.cs文件中,类ToolKit在ToolKit.cs文件中时,#define Buged需要在Program.cs文件头部和ToolKit.cs文件头部均定义,示例代码如下:
#define Buged //C#的宏定义必须在所有代码之前。当前只让Buged宏有效
//#define NoBug
//#define Li
//#define Zhang
using System;
using System.Diagnostics;
namespace AttributeTest
{class Program{static void Main(string[] args){ToolKit.FuncA();ToolKit.FuncB();ToolKit.FuncC();ToolKit.FuncD();Console.ReadKey();}}
}#define Buged //C#的宏定义必须在所有代码之前。当前只让Buged宏有效
//#define NoBug
//#define Li
//#define Zhang
using System;
using System.Diagnostics;
namespace AttributeTest
{public class ToolKit{[Conditional("Li")][Conditional("Buged")]public static void FuncA(){Console.WriteLine("Created by Li, Buged");}[Conditional("Li")][Conditional("NoBug")]public static void FuncB(){Console.WriteLine("Created by Li, NoBug");}[Conditional("Zhang")][Conditional("Buged")]public static void FuncC(){Console.WriteLine("Created by Zhang, Buged");}[Conditional("Zhang")][Conditional("NoBug")]public static void FuncD(){Console.WriteLine("Created by Zhang, NoBug");}}
}
运行结果如下:
注意:运行结果是由代码中“#define Buged ”这个宏定义所决定。
五、系统Attribute范例分析
1、在本例中,我们使用了ConditionalAttribute这个Attribute,它被包含在System.Diagnostics命名空间中,多半时间是用来做程序调试与诊断的。
2、与ConditionalAttribute相关的是一组C#宏,它们看起来与C语言的宏别无二致,位置必须在所有C#代码之前。顾名思义,ConditionalAttribute是用来判断条件的,凡被ConditionalAttribute(或Conditional)”附着”了的方法,只有满足了条件才会执行。
3、就像船底上可以附着很多牡蛎一样,一个方法上也可以附着多个ConditionalAttribute的实例。把Attribute附着在目标上的书写格式很简单,使用方括号把Attribute括起来,然后紧接着写Attribute的附着体即可。当多个Attribute附着在同一个目标上时,就把这些Attribute的方括号一个挨一个地书写(或者在一对方括号中书写多个Attribute),而且不必在乎它们的顺序。
4、在使用Attribute的时候,有“长记法”和“短记法”两种。
由上面的第三条和第四条我们可以推出,以下四种Attribute的使用方式完全等价:
//长记法
[ConditionalAttribute("Li")]
[ConditionalAttribute("NoBug")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//短记法
[Conditional("Li")]
[Conditional("NoBug")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//换序
[Conditional("NoBug")]
[Conditional("Li")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//单括号叠加
[Conditional("NoBug"),Conditional("Li")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
相关文章:

C#中的Attribute详解(上)
C#中的Attribute详解(上) 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多…...

天津医科大学临床医学院专升本药学专业有机化学考试大纲
天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解,能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…...

电脑开机自动断电,简单4招,快速解决!
“不知道我的电脑最近是怎么回事,每次一开机就会出现自动断电的情况,有什么方法可以解决吗?” 在使用电脑时,由于电源供应不稳定或过热,以及各种硬件问题,可能会导致电脑开机自动断电。遇到这种情况&#x…...

线程基础知识(三)
前言 之前两篇文章介绍了线程的基本概念和锁的基本知识,本文主要是学习同步机制,包括使用synchronized关键字、ReentrantLock等,了解锁的种类,死锁、竞争条件等并发编程中常见的问题。 一、关键字synchronized synchronied关键…...

elasticsearch系列七:聚合查询
概述 今天咱们来看下es中的聚合查询,在es中聚合查询分为三大类bucket、metrics、pipeline,每一大类下又有十几种小类,咱们各举例集中,有兴许的同学可以参考官网:https://www.elastic.co/guide/en/elasticsearch/refere…...
SQL面试题挑战11:访问会话切割
目录 问题:SQL解答: 问题: 如下为某电商公司用户访问网站的数据,包括用户id和访问时间两个字段。现有如下规则:如果某个用户的连续的访问记录时间间隔小于60秒,则属于同一个会话,现在需要计算每…...
2023“楚怡杯”湖南省赛“信息安全管理与评估“--应急响应(高职组)
2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书 2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书第一阶段竞赛项目试题第二阶段竞赛项目试题网络安全事件响应:需要环境私聊博主:2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书 第一…...
【Python百宝箱】Python引领制造变革:CAM技术全景解析与实战指南
Python 驭技术潮流:探索计算机辅助制造的全方位工具库 前言 在当今制造业的快速发展中,计算机辅助制造(Computer-Aided Manufacturing,CAM)技术扮演着至关重要的角色。为了提高制造效率、优化工艺流程以及实现数字化…...

【新版Hi3559AV100 旗舰8K30 AI摄像机芯片】
新版Hi3559AV100 旗舰8K30 AI摄像机芯片 一、总体介绍 Hi3559AV100是专业的8K Ultra-HD Camera SOC,它提供了8K30/4K120广播级图像质量的数字视频录制,支持8路Sensor输入,支持H.265编码输出或影视级的RAW数据输出,并集成高性能ISP…...
小样本学习idea(不断更新)
在此整理并记录自己的思考过程,其中不乏有一些尚未成熟或者尚未实现的idea,也有一些idea实现之后没有效果或者正在实现,当然也有部分idea已写成论文正在投稿,都是自己的一些碎碎念念的思考,欢迎交流。 研一上学期 9.…...

表情包搜索网站
一个非常不错的表情包搜索网站,输入关键词即可得到所有相关的表情,还可以选择套图下载,自制表情,非常给力666 可以点击下载,会新建窗口打开图片,鼠标右键“图片另存为”,下载文件名手动补充“…...

Linux账号和权限管理
目录 一、用户账号和组账号概述 1、用户账号类型 2、组账号 1.基本组(私有组) 2.附加组(公共组) 3、ID 1.UID 2.GID 4、用户和账号管理 1.文件位置 2.useradd-----创建用户 3.userdel——删除用户账号 4.usermod---修…...
Qt/QML编程学习之心得:QML和C++的相互调用(十五)
Qt下的QML说到底是类似于JavaScript的一种解释性语言,习惯了VC的MVC(Veiw+Control)的模式,那种界面视图任何事件都是和C++的cpp中处理函数一一对应,在类中也有明确的说明的。一下子玩Qt会觉得哪里对不上,比如使用QML这种节脚本语言贴了图做了layout布局,那么一个按钮的o…...

月入10.5K,专科小伙转行网优:据说每个领域都有一个“显眼包”
网络热词流行的今天,显眼包一词又上热搜。除了熟知的内娱显眼包外,其实各行业也都有自己的“显眼包”。 显眼包又叫“现眼包”看似丢人现眼,实则是个“褒义词”,他们勇敢自信,积极乐观,敢于展示自己&#x…...

Python自动化测试:选择最佳的自动化测试框架
在开始学习python自动化测试之前,先了解目前市场上的自动化测试框架有哪些? 随着技术的不断迭代更新,优胜劣汰也同样发展下来。从一开始工具型自动化,到现在的框架型;从一开始的能用,到现在的不仅能用&…...

Ubuntu16.04 安装Anaconda
步骤 1: 去官网下载安装包,链接如下: https://repo.anaconda.com/archive/ 找到对应版本下载至本地电脑,并上传至服务器。 步骤2: 通过命令解压 sh Anaconda3-2023.03-0-Linux-x86_64.sh 一路选择yes或则回车,直到安装成功出现下面画面&…...

MR实战:统计总分与平均分
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启…...

Redux与React环境准备、实现counter(及传参)、异步获取数据
环境说明: 一:说明 在React中使用redux,官方要求安装两个其他插件:Redux Toolkit和react-redux 1. Redux ToolKit(RTK) - 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式 (简化…...

网站服务器被入侵,如何排查,该如何预防入侵呢?
在我们日常使用服务器的过程中,当公司的网站服务器被黑客入侵时,导致整个网站以及业务系统瘫痪,将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应,对入侵问题做到及时处理,以最快的时间…...

应用在网络摄像机领域中的国产音频ADC芯片
IPC:其实叫“网络摄像机”,是IP Camera的简称。它是在前一代模拟摄像机的基础上,集成了编码模块后的摄像机。它和模拟摄像机的区别,就是在新增的“编码模块”上。模拟摄像机,顾名思义,输出的是模拟视频信号…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...