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

C#基础10-结构体和枚举

零、文章目录

C#基础10-结构体和枚举

1、结构体

(1)核心特性
  • 值类型本质
    • 内存分配在栈上(类在堆上)
    • 赋值时复制完整数据副本(非引用)
PointStruct p1 = new PointStruct(1, 2);  
PointStruct p2 = p1;  // p2是p1的独立副本  
p2.X = 3;             // p1.X仍为1 
  • 默认构造函数限制
    • 不能自定义无参构造函数(编译器强制隐式生成)
    • 有参构造函数必须初始化所有字段:
public struct Point {  public int X;  public int Y;  public Point(int x, int y) {  X = x;  // 必须初始化  Y = y;  // 否则编译错误  }  
}  
  • 字段初始化限制:声明时禁止直接赋初值(类允许)
public struct BadExample {  public int Value = 10; // 编译错误 
}  
  • 继承与多态
    • 不支持继承其他结构体或类(隐式继承System.ValueType
    • 可实现接口(如 IComparable
(2)结构体 vs 类
特性结构体(struct)类(class)
类型值类型(栈内存)引用类型(堆内存)
赋值行为复制完整数据副本复制引用地址
null值不可为null(除非Nullable<T>默认值为null
内存开销小对象高效(通常<16字节)大对象或长期存在对象更合适
构造函数不能自定义无参构造可自定义无参构造
字段初始化声明时禁止赋初值允许声明时初始化
继承不支持支持单继承和多态
  • 赋值差异图示:

(3)适用场景与最佳实践
  • 优先使用结构体
    • 轻量级数据对象(如坐标Point、颜色Color
    • 数据大小小于16字节(避免复制开销过大)
    • 需要高频创建销毁的临时对象(栈分配更快)
    • 设计为不可变类型(避免值复制引发逻辑错误)
  • 避免使用结构体
    • 需继承或多态的场景
    • 对象状态需频繁修改(值类型复制开销大)
    • 大小超过16KB(栈内存限制)
  • 性能优化技巧
    • 避免频繁装箱拆箱(如存入ArrayList改用List<T>
    • 只读结构体提升安全性:
public readonly struct ImmutablePoint {  public int X { get; }  // 只读属性  public int Y { get; }  
}  
(4)关键注意事项
  • 慎用大型结构体 :超过16字节时,赋值复制可能比引用传递更慢
  • 接口实现限制:通过接口访问结构体会触发装箱操作(性能损失)
  • 默认值问题:未显式初始化时,数值类型为0,布尔类型为false

2、枚举

(1)基础定义与特性
  • 核心作用
    • 定义一组命名常量的值类型,用于表示有限且互斥的选项(如状态码、类型分类)。
    • 默认基础类型为 int,可显式指定为其他整数类型(byte, long 等)。
  • 声明语法
public enum Season 
{Spring,  // 默认值 0 Summer,  // 默认值 1Autumn = 2,  // 显式赋值 Winter   // 自动递增为 3
}
  • 默认值规则
    • 首成员未赋值时默认为 0,后续成员依次递增 1。
    • 重要限制:枚举变量未初始化时默认值为 0(即使未定义值为 0 的成员)。
(2)高级用法:位标志(Flags)
  • 通过 [Flags] 特性支持组合值,用于多选场景(如权限系统):
[Flags]
public enum FileAccess 
{None = 0,        // 避免使用 0 表示有效标志 Read = 1 << 0,   // 二进制 0001 (值 1)Write = 1 << 1,  // 二进制 0010 (值 2)Execute = 1 << 2 // 二进制 0100 (值 4)
}// 使用按位或组合选项 
var access = FileAccess.Read | FileAccess.Write; // 值 3 (二进制 0011)
Console.WriteLine(access); // 输出 "Read, Write"
  • 关键要点:
    • 成员值需为 2 的幂次方,确保位运算正确 。
    • 避免用 0 表示有效标志(None 除外)。
(3)枚举转换与操作
  • 与整数互转
int value = (int)Season.Summer;      // 1
Season season = (Season)2;           // Autumn 
  • 与字符串互转
string name = Season.Spring.ToString();      // "Spring"
Season parsed;
bool success = Enum.TryParse("Winter", out parsed); // true
  • 反射操作
// 获取所有成员名 
string[] names = Enum.GetNames(typeof(Season)); 
// 获取所有值 
Array values = Enum.GetValues(typeof(Season)); 
// 获取基础类型 
Type baseType = Enum.GetUnderlyingType(typeof(Season)); // System.Int32 
(4)最佳实践与场景
  • 适用场景
    • 状态码(如 HTTP 状态 200_OK, 404_NotFound)。
    • 分类选项(如用户等级 Gold, Silver)。
    • 多选标志(权限控制、选项组合)。
  • 设计建议
    • 为成员添加 XML 注释或 Description 特性增强可读性。
    • 避免重复值,强制显式赋值以提升代码可维护性。
public enum UserLevel
{[Description("金牌会员")]Gold = 1,[Description("银牌会员")]Silver = 2
}
️(5)常见误区
  • 未处理非法值 :使用 Enum.IsDefined 验证值合法性:
Season invalid = (Season)10; // 合法但无对应成员
Console.WriteLine(invalid);  // 输出 "10"
if (Enum.IsDefined(typeof(Season), value)) { ... }
  • 忽略默认值风险:未初始化的枚举变量值为 0,需确保 0 值有明确语义(如 None)。
(6)枚举与描述转换
public static class EnumExtensions 
{public static string GetDescription(this Enum value){FieldInfo field = value.GetType().GetField(value.ToString());DescriptionAttribute attribute = field.GetCustomAttribute<DescriptionAttribute>();return attribute?.Description ?? value.ToString();}
}// 使用 
UserLevel level = UserLevel.Gold;
Console.WriteLine(level.GetDescription()); // 输出 "金牌会员"
http://www.dtcms.com/a/431946.html

相关文章:

  • 网站建设 福田东莞推广系统怎么做
  • 怎么做免费域名网站wordpress 图片库
  • 全网营销公司洛阳seo网络推广
  • git知识点
  • 制作网站要钱吗oppo开放平台
  • AI 伦理困局:参与式治理如何破解技术狂飙
  • 广州新际网站建设公司怎么样大连本地网
  • 【算法训练营Day27】动态规划part3
  • 网站后台管理系统软件开发一款app成本
  • 衡阳网站建设专家今天的特大新闻有哪些
  • 电子政务网站建设西安网站建设电话
  • 论文解读:GRAPHEVAL: A LIGHTWEIGHT GRAPH-BASED LLM FRAMEWORK FOR IDEA EVALUATION
  • 门业网站 模板it运维工程师工作内容
  • 河北省住房和城乡建设厅网站打不开学做网站论坛教程下载
  • Java 异常体系:从 Throwable 根类到自定义异常,一篇理清所有分类与逻辑
  • 仿5173网站汕尾旅游攻略app跳转网站
  • memory_profiler各个参数都是什么意思?
  • 网站开发技术简介dwsynology建设网站
  • p2p网站建设框架如何在google上免费推广
  • win7 win10 win11安装IE11浏览器
  • 深度学习池化(Pooling)的进阶应用与优化策略
  • 家庭宽带 做网站wordpress登陆后返回
  • 松岗网站的建设sasaki景观设计公司官网
  • 关于win11的Microsoft To Pdf打印机修改端口后无法再刷新显示于设备界面的问题
  • 深圳市网站建设外包公司排名某个网站做拍卖预展的好处
  • 苏州做网站公司认定苏州聚尚网络创新创意产品设计作品
  • AOI检测在半导体制造领域有哪些主要应用
  • 含山建设局网站支持快钱支付的网站
  • Win环境下包管理工具
  • 陕西西安网站建设公司哪家好微网站方案怎么写