学习c#的第十九天

目录

C# 特性(Attribute)

规定特性(Attribute)

预定义特性(Attribute)

创建自定义特性(Attribute)


C# 特性(Attribute)

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

规定特性(Attribute)

在 C# 中,规定特性(Attribute)的语法如下所示:

[attribute(positional_parameters, name_parameter = value, ...)]
element
  • attribute 表示特性的名称,它是放置在方括号内的标识符。
  • positional_parameters 是特性的必需参数,它们按照在特性类中声明的顺序进行传递。
  • name_parameter = value 是特性的可选命名参数,它们需要使用名称来指定参数,并且可以包含默认值。

element 可以是一个程序中的各种代码元素,如类、方法、属性等。特性会应用到这些代码元素上,为它们添加额外的元数据信息。

以下是一个示例,演示了一个特性的使用:

[Serializable]
public class MyClass
{// 类定义
}

在这个示例中,Serializable 是一个特性,它被应用到 MyClass 类上,为这个类添加了序列化的能力。

另外,特性也可以带有参数,例如:

[Author("John Doe", Version = 2)]
public void SomeMethod()
{// 方法定义
}

这里的 Author 特性带有一个位置参数和一个命名参数,它们提供了关于方法作者和版本信息的元数据。

预定义特性(Attribute)

.Net 框架提供了三种预定义特性:

1、AttributeUsage

AttributeUsage 特性用于指定自定义特性的使用方式。通过在自定义特性类上应用 AttributeUsage 特性,可以定义该特性可以应用到哪些程序元素上,以及是否允许多次应用同一个特性。

以下是一个关于 AttributeUsage 的简单示例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class CustomAttribute : Attribute
{// 自定义特性类的定义
}[Custom]
public class MyClass
{// 类定义
}[Custom]
public void MyMethod()
{// 方法定义
}

在这个示例中,AttributeUsage 特性被应用到 CustomAttribute 类上。它指定了该特性可以应用到类和方法上(通过 AttributeTargets.Class | AttributeTargets.Method 参数),允许多次应用同一个特性(AllowMultiple = true),并且不允许继承(Inherited = false)。 

2、Conditional

Conditional 特性允许您将方法调用标记为条件方法调用。这意味着,带有 Conditional 特性的方法只有在定义了特定的预处理器符号时才会被调用。

下面是一个简单的示例:

#define DEBUGpublic class MyClass
{[Conditional("DEBUG")]public void DebugMethod(){// 调试时执行的代码}public void SomeMethod(){DebugMethod();  // 只有在定义了 DEBUG 符号时才会被调用}
}

在这个示例中,DebugMethod 方法带有 Conditional 特性,并且只有在定义了名为 DEBUG 的预处理器符号时才会被调用。 

3、Obsolete

Obsolete 特性用于标记代码中已经过时的元素(如方法、属性等)。当程序中使用了被 Obsolete 标记的元素时,编译器会发出警告或错误信息,提示开发人员使用更新的替代方案。

以下是一个简单的示例:

public class MyClass
{[Obsolete("This method is obsolete. Use NewMethod instead.")]public void OldMethod(){// 过时的方法实现}public void NewMethod(){// 新方法的实现}
}

在这个示例中,OldMethod 方法被标记为过时,当其他代码调用它时,会得到一条警告,提示开发者使用 NewMethod 方法代替。

创建自定义特性(Attribute)

.Net 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关。

创建并使用自定义特性包含四个步骤:

1、声明自定义特性

首先,你需要声明一个新的特性类。这个类应该继承自 System.Attribute 类。在这个类中,你可以添加自定义的属性和方法,以便存储和处理声明性的信息。以下是一个简单的示例:

using System;[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
public class CustomAttribute : Attribute
{private string description;public CustomAttribute(string description){this.description = description;}public string Description{get { return description; }}
}

2、构建自定义特性

在上面的示例中,我们创建了一个名为 CustomAttribute 的自定义特性类。该类具有一个带有描述信息参数的构造函数,并且具有一个名为 Description 的只读属性。

3、在目标程序元素上应用自定义特性

一旦你声明了自定义特性类,你就可以在目标程序元素(如类、方法等)上应用这个特性。例如,在一个类或方法的前面使用 [Custom("Some description")] 这样的语法来应用自定义特性。

4、通过反射访问特性

最后,你可以使用反射来访问应用在目标程序元素上的自定义特性,并检索其中存储的信息。通过反射,你可以在运行时获取和处理这些特性,以实现根据特性存储的信息来定制程序行为。

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

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

相关文章

嵌入式QTGit面试题

自己在秋招过程中遇到的QT和嵌入式和Git相关的面试题,因为比较少就一起放了 QT connect第5个参数是什么? Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。 如果接收者和发送者在同一个线程,则…

【机器学习】决策树算法理论:算法原理、信息熵、信息增益、预剪枝、后剪枝、算法选择

1. 决策树概念 通过不断的划分条件来进行分类,决策树最关键的是找出那些对结果影响最大的条件,放到前面。 我举个列子来帮助大家理解,我现在给我女儿介绍了一个相亲对象,她根据下面这张决策树图来进行选择。比如年龄是女儿择偶更…

0068【Edabit ★☆☆☆☆☆】I‘d Like a New Shade of Blue, Please

0068【Edabit ★☆☆☆☆☆】I’d Like a New Shade of Blue, Please math numbers Instructions I have a bucket containing an amount of navy blue paint and I’d like to paint as many walls as possible. Create a function that returns the number of complete wal…

【如何学习Python自动化测试】—— 自动化测试环境搭建

1、 自动化测试环境搭建 1.1 为什么选择 Python 什么是python,引用python官方的说法就是“一种解释型的、面向对象、带有励志语义的高级程序设计语言”,对于很多测试人员来说,这段话包含了很多术语,而测试人员大多是希望利用编程…

CLEARTEXT communication to XX not permitted by network security policy 报错

在进行网络请求时,日志中打印 CLEARTEXT communication to XX not permitted by network security policy 原因: Android P系统网络访问安全策略升级,限制了非加密的流量请求 Android P系统限制了明文流量的网络请求,之下的版本…

和鲸科技创始人范向伟受邀出席“凌云出海,来中东吧”2023华为云上海路演活动

11月9日,华为云“凌云出海,来中东吧”系列路演活动第二场在上海正式开启。聚焦“创业全球化”,本次活动由华为云携手阿布扎比投资办公室(ADIO)举办,旨在与渴望出海发展的优秀创业者们共探出海中东新商机。 …

【GAN】数据增强基础知识

最近要用到,但是一点基础都没有,故开个文章记录一下笔记 目录 GAN DCGAN WGAN EEGGAN GAN 参考 生成对抗网络(GAN) - 知乎 (zhihu.com) 文章 [1406.2661] Generative Adversarial Networks (arxiv.org) 代码 GitHub - …

Vue3-watchEffect函数

Vue3-watchEffect函数 功能&#xff1a;watchEffect 函数在一开始时就会执行一次&#xff0c;而当中的回调函数的属性发生变化&#xff0c;那么watchEffect 就会再执行一次&#xff0c;主要作用还是在于监视回调函数每次的变化。 // App.vue <template><h2>计数…

传输层安全协议TLS——密码学概述

文章目录 一、TLS1.3基础理论知识二、TLS机密性三、TLS1.3 密钥配送四、TLS1.3 消息完整性五、TLS1.3 身份验证与中间人攻击 一、TLS1.3基础理论知识 TLS 1.3 是一种用于保障网络通信安全的协议&#xff0c;它是 TLS&#xff08;Transport Layer Security&#xff09;协议的最…

一个美观且功能丰富的 .NET 控制台应用程序开源库

推荐一个美观且功能丰富的 .NET 控制台应用程序开源库&#xff0c;从此告别黑漆漆的界面。 01 项目简介 Spectre.Console 是一个开源的 .NET 库&#xff0c;用于创建美观、功能丰富的控制台&#xff08;命令行&#xff09;应用程序。它提供了一组易于使用的 API&#xff0c;…

VScode 配置用户片段

文件->首选项->配置用户片段->新建全局用户片段 后续就可以通过vv3来直接生成下面的代码 {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the l…

阿里云崩了,总结我们从云上搬到线下经历了什么

我们做钢铁行业云的时候&#xff0c;也曾购买过某讯的云服务器。当时某讯做活动&#xff0c;头3年比较便宜&#xff0c;大概买了40台左右云服务器。 但是&#xff0c;3年期间使用云服务器的经历&#xff0c;体验并不好&#xff1a;1.我们云服务器的密码都是随机生成的&#xff…

Shell 使用日期或计数器 命名 文件

date获取系统时间&#xff0c;"%Y_%m_%d_%H_%M_%S"指定格式&#xff0c;$time 输出时间&#xff0c; ~/Desktop/ $newFile指定位置下的文件夹 #!/bin/bashtime$(date "%Y_%m_%d_%H_%M_%S") newFile$time".log" echo $time > ~/Desktop/$newF…

多视图聚类的论文阅读

当聚类的方式使用的是某一类预定义好的相似性度量时&#xff0c; 会出现如下情况&#xff1a; 数据聚类方面取得了成功&#xff0c;但它们通常依赖于预定义的相似性度量&#xff0c;而这些度量受原始方法的影响:当输入维数相对较高时&#xff0c;往往是无效的。 1. Deep Mult…

C++ 编写动态二维double型数据类Matrix

【问题描述】 编写一个程序&#xff0c;定义一个安全、动态二维double型的数组类Matrix。 实现Matrix table(row,col)定义row行col列的二维数组, row和col为正整数&#xff1b;实现table(i,j)访问table的第i行第j列的元素&#xff0c;行号和列号从0开始&#xff1b;实现Matri…

解决Requests中使用httpbin服务器问题:自定义URL的实现与验证

问题背景 在使用Python的Requests模块进行单元测试时&#xff0c;可能会遇到无法使用本地运行的httpbin服务器进行测试的问题。这是因为测试脚本允许通过环境变量HTTPBIN_URL指定用于测试的本地httpbin实例&#xff0c;但在某些测试用例中&#xff0c;URL是硬编码为httpbin.or…

Linux 系统目录结构

Linux 系统目录结构 登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 你会看到如下图所示: 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放…

linux(centos7)常用命令 开启关闭防火墙

查看防火墙状态 centos7 systemctl status firewalld.service 运行上述命令后&#xff0c;如果看到有绿色字样标注的“active&#xff08;running&#xff09;”&#xff0c;说明防火墙是开启状态。 开启防火墙 centos7 systemctl start firewalld.service 关闭防火墙 c…

Java 实现统计文件字符

要求 编写程序&#xff0c;统计英文文本文件中的字符数目和单词数目。程序运行时&#xff0c;输入要统计的文件的名称&#xff0c;程序处理后输出字符数目和单词数目。 代码 import java.util.*; import java.io.IOException; import java.nio.file.*; public class Main3{p…

PbootCMS 应用快速迁移至浪潮信息 KeyarchOS 云服务器

本文我们以 PbootCMS 应用为例&#xff0c;详细介绍如何使用 X2Keyarch 迁移工具将其从 CentOS 系统迁移到浪潮信息 KeyarchOS 系统。 背景介绍 众所周知&#xff0c;CentOS 是最流行的红帽克隆版&#xff0c;因为免费&#xff0c;所以它的安装量甚至比红帽本身要大得多。本来…