C#枚举及特性应用
枚举(Enum)
枚举的主要使用场景
1.提高代码可读性:使用枚举可以给特定的数据集起一个有意义的名字,这样在阅读代码时更容易理解这些数据代表的意义。
2.减少错误:通过限制变量只能取枚举中定义的值,可以避免输入非法或无意义的值,从而减少程序中的错误。
3.类型安全:枚举是类型安全的,这意味着编译器可以检查类型正确性,防止不同类型的枚举值之间的混淆。
4.便于维护:如果需要修改或扩展枚举中的值,通常只需要修改枚举定义本身,而不需要更改使用这些值的代码。
5.实现逻辑控制:枚举常用于实现逻辑控制结构,如switch-case语句,使逻辑更加清晰。
6.表示状态或选项:枚举非常适合用来表示有限的状态集合或选项列表,比如一周中的某一天、颜色、方向等。
7.资源管理:在某些情况下,枚举可以用来表示系统中的资源或配置选项,帮助管理和访问这些资源。
8.数据交换与存储:枚举可以简化数据交换和存储的过程,特别是在序列化和反序列化对象时,使用枚举可以使数据更加紧凑和易于理解。
枚举在代码中的表现
1.创建一个普通的类Class改为Enum,并且Enum可以继承基础类型
2.各个属性间用逗号分隔,起名尽量见名知意
3.使用时只需用枚举名.枚举值即可
4.作为switch的判定条件时,使用枚举变量即可
5.枚举与基础类型的转换使用TryParse(value,out enum) value为基础类型或string enum为枚举类型变量
6.遍历枚举时只需通过Enum.GetValues(typeof(LineNameEnum))获取到枚举中所有值再进行foreach遍历即可
7.转换成字符串类型只需调用ToString方法即可
C#特性(Attribute)
特性的主要应用场景
1.提供元数据:特性可以为程序元素(如类、方法、字段等)添加额外的信息,这些信息可以在编译时或运行时被其他代码访问。
2.影响运行时行为:通过特性,可以改变程序元素在运行时的行为。例如,使用[Serializable]
特性可以让类支持序列化。
3.编译时验证:某些特性可以用于编译时验证代码的正确性,如[Obsolete]
特性可以标记过时的方法或类,当使用这些过时的成员时,编译器会发出警告或错误。
4.代码生成:特性可以用于指导代码生成工具生成特定的代码。例如,在ASP.NET MVC中,路由特性可以用来指定URL映射规则。
5.自定义行为:开发者可以通过创建自定义特性来实现特定的功能或需求,如日志记录、权限检查等。
这里主要讲一下自定义特性
比如我们定义了一个自定义特性
在使用时我们需默认省略掉Attribute即[LineName("")]
LineNameAttribute在定义时需要public class LIneNameAttribute :Attribute 需要继承特性类,并且在定义时可以自由定义他的属性以及构造函数比如
{
public string Name{get;private set}
LineNameAttribute(string name)
{
Name = name;
}
}
在这里我们调用[LineName("BeiJing9")]时就会将特性中的Name值改为BeiJing9,这个值独属于附加上这个特性的变量或方法
比如
[LineName("BeiJing9")]
public class myapp
{
//类体
}
在调用myapp这个类时我们可以使用反射获得特性值
比如
Attribute中的GetCustomAttribute()方法,参数列表选择typeof(myapp),typeof(LineNameAttribute) 使用(LineNameAttribute)强制转换一下类型,使用LineNameAttribute对象接收,使用创建出来的对象line即可访问line.Name;
组合使用
为枚举创建一个特性,给每个枚举类型加上特性
创建一个GetAttribute方法接收一个Enum值
获取所有具有指定名称的公共字段fieldInfo,然后通过fieldInfo调用GetCustomAttribute方法获取特性对象,接下来就可以通过这个对象获得属性Name了
public string GetLineNameAttribute(LineNameEnum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var attribute = fieldInfo.GetCustomAttribute(typeof(LineNameAttribute), false) as LineNameAttribute;
if (attribute.Name != null)
return attribute.Name;
return null;
}
通过反向寻值就没什么好讲的了,将特性值反向寻找枚举只需要遍历枚举对比传入值合适再返回即可,代码奉上
public LineNameEnum? GetLineNameEnum(string value)
{
foreach (LineNameEnum a in Enum.GetValues(typeof(LineNameEnum)))
{
var feildInfo = a.GetType().GetField(a.ToString());
var attribute = feildInfo.GetCustomAttribute(typeof(LineNameAttribute), false) as LineNameAttribute;
if (attribute != null && attribute.Name == value)
{
return a;
}
}
return null;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人