当前位置: 首页 > news >正文

C# 特性详解

在 C# 中,特性(Attribute)是一种给代码添加额外信息(元数据)的机制。它不会直接改变代码逻辑,而是为类、方法、属性、字段等附加说明,供编译器、运行时、框架或程序员读取和使用

简单理解:

特性 = 给代码贴标签,让程序知道这段代码有什么特殊说明。

例如:

[Obsolete("这个方法已经过时,请使用NewMethod")] public void OldMethod() { }

这里[Obsolete]就是一个特性,它告诉编译器:

这个方法已经废弃,调用时提醒开发者。


一、为什么需要特性?

假设没有特性:

public class User { public string Name; public int Age; }

程序不知道:

  • Name 是否必须填写?
  • Age 是否需要验证?
  • 这个类是否需要序列化?
  • 是否需要映射数据库?
  • 是否需要参与权限控制?

如果使用特性:

public class User { [Required] public string Name { get; set; } [Range(0,120)] public int Age { get; set; } }

框架看到:

Name → 必填 Age → 范围0~120

然后自动执行验证。


二、特性的基本语法

1. 特性写法

[特性名称] public class MyClass { }

例如:

[Serializable] public class Person { }

2. 多个特性

[Serializable] [Obsolete] public class Person { }

也可以:

[Serializable, Obsolete] public class Person { }

三、C# 常用内置特性

1. Obsolete(过时提醒)

用于标记废弃代码。

例如:

public class Calculator { [Obsolete] public int Add(int a,int b) { return a+b; } }

调用:

Calculator c=new Calculator(); c.Add(1,2);

提示:

Add方法已经过时

强制报错:

[Obsolete("请使用AddNew",true)] public int Add(int a,int b) { return a+b; }

第二个参数:

false 警告 true 错误

2. Serializable(序列化)

表示对象可以转换为二进制数据。

[Serializable] public class Student { public string Name; public int Age; }

表示:

Student对象 | ↓ 二进制数据

3. Conditional(条件编译)

控制代码是否执行。

#define DEBUG class Test { [Conditional("DEBUG")] public void Log() { Console.WriteLine("测试日志"); } }

如果:

#define DEBUG

存在:

执行。

否则:

方法调用会被忽略。


4. AttributeUsage

用于限制自定义特性使用范围。

例如:

[AttributeUsage(AttributeTargets.Class)] public class MyAttribute:Attribute { }

表示:

只能用于:

[My] class Person { }

不能:

[My] void Test() { }

四、自定义特性(重点)

实际开发中大量使用。

例如:

创建一个:

作者信息特性

第一步:继承 Attribute

public class AuthorAttribute:Attribute { }

规定:

所有特性必须继承:

System.Attribute

第二步:添加属性

public class AuthorAttribute:Attribute { public string Name {get;set;} public string Date {get;set;} }

第三步:使用

[Author(Name="张三",Date="2026")] public class Book { }

五、读取特性(反射)

特性本身不会自动执行。

需要:

Reflection(反射)

例如:

var type=typeof(Book); var attrs=type.GetCustomAttributes(); foreach(var attr in attrs) { Console.WriteLine(attr); }

输出:

AuthorAttribute

读取具体信息:

AuthorAttribute author = (AuthorAttribute)Attribute.GetCustomAttribute( typeof(Book), typeof(AuthorAttribute) ); Console.WriteLine(author.Name);

结果:

张三

六、特性参数类型

特性只能接受:

允许:

✅ 基本类型

int string bool double

✅ 枚举

enum Level { Low, High }

使用:

[My(Level.High)]

✅ Type类型

[Service(typeof(User))]

不能:

❌ 对象

new User()

❌ List

List<string>

七、特性的实际应用

1. ASP.NET Core 路由

例如:

[HttpGet] public IActionResult GetUser() { }

作用:

告诉框架:

这个方法处理GET请求

2. 数据验证

public class User { [Required] public string Name {get;set;} [EmailAddress] public string Email {get;set;} }

框架自动验证。


3. ORM数据库映射

例如:

public class User { [Key] public int Id {get;set;} [Column("user_name")] public string Name {get;set;} }

告诉 ORM:

Id 是主键 Name对应数据库字段 user_name

4. JSON序列化

public class User { [JsonIgnore] public string Password {get;set;} }

结果:

{ "Name":"Tom" }

Password不会输出。


八、特性执行流程

完整过程:

源代码 ↓ [Attribute] ↓ 编译器保存元数据 ↓ 程序集 DLL ↓ 反射读取 ↓ 框架执行对应功能

九、特性 vs 接口

很多初学者容易混淆。

接口:

表示:

你必须拥有某种能力

例如:

interface IFly { void Fly(); }

飞机:

class Plane:IFly { }

特性:

表示:

给你添加说明

例如:

[Flying] class Plane { }

区别:

接口特性
作用约束行为添加信息
是否必须实现方法
运行时读取经常
典型用途多态框架配置

十、企业开发常见特性体系

学习 C# 后期必须掌握:

基础

Attribute AttributeUsage Reflection

Web开发

[ApiController] [Route] [HttpGet] [Authorize]

数据库

[Key] [Table] [Column] [ForeignKey]

序列化

[JsonProperty] [JsonIgnore] [Serializable]

AOP编程

例如:

[Log] [Transaction] [Cache]

自动实现:

调用前记录日志 执行事务 缓存结果
http://www.jsqmd.com/news/1188797/

相关文章:

  • 数字温度传感器应用于服务器系统热管理方案的优势
  • C++算法竞赛入门:模拟法核心思想、分类与实战避坑指南
  • 探索nvidia/Wan2.2-T2V-A14B-Diffusers-NVFP4的参数配置:分辨率、帧率与推理步数优化技巧
  • AI特效制作实战:从Stable Diffusion到Runway ML的创意教学应用
  • 炼丹实录:训练一个高质量人物LoRA的全流程手记
  • 2026北京海淀劳力士欧米茄回收真相!全域最优变现渠道与靠谱门店推荐 - 全城热点
  • 工业能源精细化管理系统方案
  • A Graph Signal Processing Framework for Hallucination Detection in Large Language Models
  • 2025 - 2026健康预警设备新趋势:精准监测与智能预警功能全揭秘
  • Win 11 修复未知文件打开方式:深入注册表,重建“打开方式”菜单关联
  • Discuz! X3.4任意文件删除漏洞(CVE-2018-14729)深度剖析与防御实战
  • 2026年毛球殿下奶糕粮57项自检与商标资质解读 - 万相科技
  • 2026 年 7 月上门收腕表,预约估价不收上门费 - 每日生活报
  • 验证码识别技术:从原理到实践
  • 2026年7月 | 微型滚珠衬套耐用性排行:五家品牌核心维度对比 - 互联网科技品牌测评
  • HarmonyOS7 长列表性能优化:渲染与内存双提升
  • 手机拍摄数据集的3D高斯重建实战指南
  • Ubuntu网络图标消失与ifconfig无网卡信息的深度排查与修复
  • Streamlining Acceptance Test Generation for Mobile Applications Through Large Language Models: An...
  • 8路智能照明控制模块助力智慧城市照明管理升级
  • 基于JSR380规范的外卖API接口参数校验链:自定义约束注解开发实践
  • 武汉手表回收套路多?劳力士避坑清单收好 - 讯息早知道
  • 基于IIC/SMBus接口数字温度传感器的精准测温方案
  • 2026上海厨卫翻新公司大比拼:10家热门品牌横向对比,益鸟美居防臭工艺优势明显 - 优家闲谈
  • 基于TPA3128D2与PIC18F86K22的高保真数字功放设计
  • 终极窗口自由:3步强制调整任意窗口大小的完整解决方案
  • 提升视频生成效率:nvidia/Wan2.2-T2V-A14B-Diffusers-NVFP4的NVFP4量化技术优势
  • 快递批量查询工具的核心能力:从万单查询到异常监控的完整方案
  • VTK中计算两点距离:从基础数学到可视化管线的工程实践
  • C# DirectX视频播放器开发:从零构建高性能渲染管线