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

自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系

以下是对它们的详细分析和对比:

1. 自定义类(Class)

优势
  • 封装性强:可以定义字段、属性、方法和事件,实现复杂的行为和逻辑。
  • 继承与多态:支持继承体系,可通过接口或抽象类实现多态。
  • 引用类型:适合需要共享状态或频繁修改的对象关系。
  • 扩展性:易于添加新功能或修改现有功能,符合面向对象设计原则。
适用场景
  • 当关系需要包含行为(如计算、验证、状态转换)时。
  • 当需要复杂的生命周期管理(如初始化、释放资源)时。
  • 当对象关系需要被多个组件共享和修改时。
示例(CAD 实体关系)
public class EntityRelationship
{public Entity Parent { get; set; }public List<Entity> Children { get; } = new List<Entity>();public double CalculateTotalArea(){double area = Parent.GetArea();foreach (var child in Children)area += child.GetArea();return area;}
}

2. 元组(Tuple)

优势
  • 语法简洁:无需定义额外的类型,直接使用内置的元组结构。
  • 轻量级:适合临时存储少量数据,无需创建专门的类。
  • 多返回值:方便方法返回多个相关值,避免使用out参数。
劣势
  • 语义模糊:元组元素通过Item1Item2访问,可读性较差(除非使用命名元组)。
  • 不可变性:默认不可变(除非使用ValueTuple),修改需创建新元组。
  • 功能有限:无法添加方法或属性,仅作为数据容器。
适用场景
  • 临时数据关联(如方法返回多个值)。
  • 简单的键值对(如字典的键)。
  • 代码简洁性优先的场景。
示例(CAD 点与实体关联)
// 使用命名元组
var pointEntityPair = (point: new Point3d(1, 2, 0), entity: GetEntity());

 

3. 字典(Dictionary)

优势
  • 高效查找:基于哈希表实现,查找、插入和删除操作的时间复杂度为 O (1)。
  • 键值对结构:适合建立对象之间的映射关系(如 ID → 实体、图层 → 实体列表)。
  • 动态扩展:可以随时添加或删除键值对。
劣势
  • 类型约束:键必须唯一,且需正确实现EqualsGetHashCode
  • 无序性:默认不保证元素顺序(除非使用SortedDictionary)。
适用场景
  • 需要快速查找或索引的关系(如根据实体 ID 查找关联数据)。
  • 动态构建的映射关系(如分组统计)。
示例(图层与实体的映射)
Dictionary<string, List<Entity>> layerEntities = new Dictionary<string, List<Entity>>();
layerEntities["Layer1"] = new List<Entity> { entity1, entity2 };

4. 结构体(Struct)

优势
  • 值类型:内存分配在栈上,适合轻量级对象,减少堆内存压力。
  • 高效访问:无需通过引用间接访问,性能略优于类。
  • 不可变性:适合设计为不可变的数据结构,线程安全。
劣势
  • 值语义:复制时会创建新实例,可能导致性能问题(尤其在大数据量时)。
  • 功能受限:不支持继承(仅支持接口),不适合复杂行为。
适用场景
  • 表示轻量级数据结构(如坐标点、尺寸)。
  • 频繁使用且数据量小的对象关系。
  • 需要不可变语义的场景。
示例(CAD 坐标点)
public struct PointPair
{public Point3d Start { get; }public Point3d End { get; }public PointPair(Point3d start, Point3d end){Start = start;End = end;}
}

对比总结

特性自定义类元组字典结构体
数据封装✅ 强(字段、方法)❌ 弱(仅数据)❌ 仅键值对✅ 中等(字段)
性能❌ 引用类型(堆分配)✅ 值类型(栈分配)❌ 哈希表开销✅ 值类型(栈分配)
语义明确性✅ 高(自定义类型)❌ 低(默认Item1✅ 中等(键值对)✅ 中等(自定义结构)
扩展性✅ 高(继承、方法)❌ 无❌ 仅键值操作❌ 有限(无继承)
适用场景复杂行为、共享状态临时数据、多返回值快速查找、映射关系轻量级数据、不可变对象

CAD 开发中的最佳实践

  1. 复杂关系用类:若需要表示实体之间的层级关系(如父子结构)或行为(如计算面积、转换坐标),使用自定义类。
  2. 临时关联用元组:在方法内部或短生命周期代码中,使用元组简化数据传递。
  3. 索引关系用字典:当需要快速查找或分组对象时(如按图层筛选实体),使用字典。
  4. 轻量数据用结构体:表示点、尺寸等轻量级数据时,使用结构体减少内存开销。
示例:综合应用
// 1. 自定义类:表示实体关系
public class EntityHierarchy
{public Dictionary<string, List<Entity>> LayerGroups { get; } = new Dictionary<string, List<Entity>>();public (Entity parent, List<Entity> children) GetGroup(string layerName){if (LayerGroups.TryGetValue(layerName, out var entities))return (entities[0], entities.Skip(1).ToList());return (null, new List<Entity>());}
}// 2. 结构体:表示尺寸
public struct Dimension
{public double Width { get; }public double Height { get; }public Dimension(double width, double height){Width = width;Height = height;}
}

总结

选择合适的数据结构取决于具体需求:

  • 优先考虑类:当关系复杂且需要行为封装时。
  • 使用元组和结构体:追求代码简洁性或性能时。
  • 依赖字典:需要高效查找或动态映射时。

在 AutoCAD 开发中,合理组合这些结构可以平衡代码的可读性、性能和可维护性。

http://www.lryc.cn/news/2380455.html

相关文章:

  • 鸿蒙北向源码开发: 检查应用接口dts文件api规范性
  • 谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频
  • 5月19日笔记
  • 从基础到高级:网站反爬技术全景解析与第三方工具对比
  • Java面试实战:从Spring Boot到分布式缓存的深度探索
  • 职坐标AIoT技能培训课程实战解析
  • pytorch小记(二十):深入解析 PyTorch 的 `torch.randn_like`:原理、参数与实战示例
  • 小结:网页性能优化
  • 8-游戏详情制作(Navigation组件)
  • Unity引擎源码-物理系统详解-其二
  • 1.3.3 数据共享、汇聚和使用中的安全目标
  • 【Docker】Docker安装Redis
  • Oc语言学习 —— Foundation框架总结
  • react+html2canvas+jspdf将页面导出pdf
  • LWIP的Socket接口
  • 基于支持向量机(SVM)的P300检测分类
  • Better Faster Large Language Models via Multi-token Prediction 原理
  • 51c嵌入式※~合集7~Linux
  • Spring的Validation,这是一套基于注解的权限校验框架
  • MySQL - 如何突破单库性能瓶颈
  • 基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
  • go封装将所有数字类型转浮点型,可设置保留几位小数
  • Rust 学习笔记:关于 Vector 的练习题
  • Linux 系统异常触发后自动重启配置指南
  • apisix透传客户端真实IP(real-ip插件)
  • Oracle 数据库的默认隔离级别
  • 统计客户端使用情况,使用es存储数据,实现去重以及计数
  • 代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I
  • oracle序列自增问题
  • 开启健康生活的多元养生之道