c#中的特性

news2024/9/21 20:30:42

在C#中,特性(Attributes)是一种向程序元素(如类、方法、属性等)添加元数据的方式。特性可以用来提供关于程序元素的附加信息,这些信息可以在编译时和运行时被访问。

特性主要有以下几个用途:

  1. 提供元数据:特性可以提供关于类、方法、属性等的附加信息,这些信息可以被编译器、运行时环境或其他工具使用。

  2. 标记程序元素:特性可以用来标记程序元素,以便在编译时或运行时进行特定的处理。例如,使用 [Obsolete] 特性可以标记一个方法或类为已过时。

  3. 自定义行为:开发者可以创建自定义特性,以提供特定的行为或功能。例如,通过自定义特性,可以在运行时动态地改变程序的行为。

  4. 支持反射:特性与反射紧密集成,使得程序可以在运行时查询和使用特性提供的信息。

  5. 简化代码:使用特性可以简化代码,避免重复代码,提高代码的可维护性和可读性。

C#中一些常用的内置特性包括:

  • [Obsolete]:用于标记类、方法、属性等为已过时,如果代码中使用了这些元素,编译器会发出警告。

  • [Serializable]:指示一个类可以被序列化,这对于跨应用程序域或网络传输对象非常有用。

  • [AttributeUsage]:定义自定义特性的使用方式,例如它可以应用于类、方法或属性。

  • [Flags]:用于标记枚举,表示枚举可以作为一组标志来使用,通常与位运算结合使用。

  • [Conditional]:用于条件编译,只有当定义了特定的预处理器符号时,标记的方法才会被调用。

using System.Diagnostics;
​
namespace _7._14day01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            UserClass userClass = new UserClass();
            userClass.print();
​
        }
        
​
    }
    public class UserClass
    {
        [DebuggerStepThrough]
        public  void print()
        {
​
            Console.WriteLine("这个方法很简单");
        }
    }
}
​

能够直接跳过该方法的Debug

using System.Diagnostics;
​
namespace _7._14day01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            UserClass userClass = new UserClass();
            userClass.print();
​
        }
        
​
    }
    public class UserClass
    {
       
        [Obsolete("1111", true)]
        public  void print()
        {
​
            Console.WriteLine("这个方法很简单");
        }
    }
}
​

当将[Obsolete]标记为true时 如果使用该类 系统会报错

使用的地方

几乎所有的框架都用到了,MVC---WebApi----EF-----IOC----AOP

特性的使用场景:可以用来做数据验证。

特性分类

第一种C#自带

第二种 自定义

使用方法如下

using System.Diagnostics;
​
namespace _7._14day01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //UserClass userClass = new UserClass();
            //userClass.print();
            //UseAttribute useAttribute = new UseAttribute();
            AttributeTest attributeTest = new AttributeTest();
            attributeTest.Test();
​
        }
​
​
    }
​
    class AttributeTest
    {
        public void Test()
        {
            Type type = typeof(UseAttribute);
            object[] obj = type.GetCustomAttributes(true);
            foreach (object customArributes in obj)
            {
                DefindAttribute defindAttribute = customArributes as DefindAttribute;
                if(defindAttribute != null)
                {
                    Console.WriteLine(defindAttribute.Showinfo);
                }
            }
        }
    }
​
    [DefindAttribute("调用了这个特性DefindAttribute")]
    class UseAttribute
    {
​
​
​
    }
    class DefindAttribute : Attribute
    {
        public DefindAttribute(string showinfo)
        {
            Showinfo = showinfo;
​
        }
        public string Showinfo { get; set; }
    }
​
​
}
​

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

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

相关文章

北京交通大学《深度学习》专业课,实验2-前馈神经网络

1. 源代码 见资源“北京交通大学《深度学习》专业课,实验2-前馈神经网络” 2. 实验内容 (1)手动实现前馈神经网络解决上述回归、二分类、多分类任务 分析实验结果并绘制训练集和测试集的loss曲线 (2)利用to…

GUI界面开发之tkinter(一)

Tkinter是一个内置的Python库,用于创建图形用户界面(GUI)。它提供了一组工具和小部件,用于创建窗口、对话框、按钮、菜单和其他GUI元素。 在本篇文章中,主要介绍了窗口等知识点。 大家好!我是码银&#x1…

STM32MP135裸机编程:烧录程序到EMMC的方法

0 前言 STM32MP135支持多种启动方式,包括SD卡、NAND Flash、EMMC等,基于STM32MP135裸机的SD卡烧录操作方法我们之前已经介绍过,现在介绍的STM32MP135烧录到EMMC的方法又和前面烧录到SD卡的操作有所不同。本文将介绍基于STM32MP135&#xff0…

缓存的击穿及解决方案

定义及图解 缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时 候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把…

Flutter 调用Google内购支付最新教程

前言: 各位同学大家好, 之前看到有人在群里问flutter 怎么调用Google支付, 今天就准备整理写一篇文章。 效果图 实现方式: 我们是通过flutter和安卓交互 然后在原生安卓里面加入了内购支付结算库的依赖 最后调起的Google 支付 安卓原生内购支付教程 flutter 端代码 我…

Go: IM系统开发及注意事项

概述 使用Go语言打造支持,同时十万人在线的IM系统系统单机支持十万人,如果分布式部署后,支持数百万都是可以的IM 系统, 即时通讯(Instant Messaging),比如说我们的微信,QQ 等IM 系统,它具备非常…

软件测试服务公司分享:系统测试和验收测试有什么联系和区别?

软件系统测试是指对软件系统的各个模块、组件以及整个系统进行全面检查和验证的过程。它旨在检测系统的功能是否符合需求、是否能够正常运行以及是否存在潜在的问题。在软件开发的整个生命周期中,系统测试是一个非常重要且必不可少的环节。 软件验收测试是软件在开…

vs code 启动react项目,执行npm start报错原因分析

1.执行 npm start错误信息:npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 npm start ~~~ CategoryInfo …

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用,可能是由于以下原因导致: 恶意攻击:攻击者利用自动化脚本或工具对接口进行大量请求,以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误:某些情…

【正点原子i.MX93开发板试用连载体验】录音小程序采集语料

本文最早发表于电子发烧友论坛:【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 接下来就是要尝试训练中文提示词。首先要进行语料采集,这是一…

C双指针元素去重

需求 在尾部插⼊、删除元素是⽐较⾼效的&#xff0c;时间复杂度 是 O(1)&#xff0c;但是如果在中间或者开头插⼊、删除元素&#xff0c;就会涉及数据的搬移&#xff0c;时间复杂度为 O(N)&#xff0c;效率较低。 代码 #include <stdio.h>// 相邻元素去重 int remove…

Linux-管道

管道&#xff1a;把一个命令的输出&#xff0c;通过管道连接&#xff0c;作为另一个命令的输入。管道的工作原理是通过一段共享内存来实现数据的传输&#xff0c;其中一个进程向管道写入数据&#xff0c;另一个进程则从管道的另一端读取数据。 1.可以通过ls -lh罗列出当前文件…

Smartbi体验中心升级新装,全产品线沉浸式体验

为了让用户更好地了解Smartbi产品在数据分析中的价值和能力&#xff0c;优化用户的产品体验&#xff0c;我们近期对Smartbi在线体验中心进行了全新改版和系统调优。本次更新内容包括全新首页、全新行业示例Demo、新增产品核心功能Demo&#xff0c;并优化了现有的Demo。让我们一…

直播预告|V学院|干货预警!2.5D、流光、动效?一次掌握!

随着可视化行业持续发展&#xff0c;可视化设计随之不断进化升级&#xff0c;对于设计师的视觉审美、设计能力和灵活运用等要求也随之进阶。可视化设计越来越卷了&#xff0c;设计师需要了解市场上的热点效果、优秀案例&#xff0c;持续学习&#xff0c;才能随行业发展不断进步…

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

合合TextIn - 大模型加速器

TextIn是合合信息旗下的智能文档处理平台&#xff0c;在智能文字识别领域深耕17年&#xff0c;致力于图像处理、模式识别、神经网络、深度学习、STR、NLP、知识图谱等人工智能领域研究。凭借行业领先的技术实力&#xff0c;为扫描全能王、名片全能王等智能文字识别产品提供强大…

Jeecgboot vue3的选择部门组件JSelectDept如何实现只查询本级以及子级的部门

jeecgboot vue3的文档&#xff1a;地址 JSelectDept组件实现了弹窗然后选择部门返回的功能&#xff0c;但部门是所有数据&#xff0c;不符合需求&#xff0c;所以在原有代码上稍微改动了一下 组件属性值如下&#xff1a; 当serverTreeDatafalse的时候&#xff0c;从后端查询…

在uniapp中如何使用地图

1&#xff0c;技术选择 最好是使用webview html形式加载&#xff0c;避免打包app时的地图加载问题 2&#xff0c;webview使用 使用webview必须按照官方文档,官网地址&#xff1a;https://uniapp.dcloud.net.cn/component/web-view.html <template><view><!…

windows电脑的linux虚拟机连接电脑网络的方法

一、虚拟机新建网络适配器,将其设置为NAT模式 子网等信息就不知道该设置什么网段的先就设置为192.168.0.x,后面可以修改 二、电脑设置 1.网络和Internet>高级网络设置 2.编辑虚拟网络NAT适配器 &#xff08;1&#xff09;选中"自动获取ip地址",确认 3.编辑WLAN…

【后端开发实习】用Redis实现消息队列邮件发送

简介 用Resi本身封装的方法相比于调redis-smq库&#xff0c;实现方式就要简单朴素很多&#xff1a; 调用redis本身的List数据结构的Lpush实现消息的进队。用Redis的List数据结构的brpop方法实现消息的出队。将出队消息通过邮件方法发送给指定的用户。 生动形象理解就是用redi…