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

自定义类、元组、字典和结构体对比——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.xdnf.cn/news/6967.html

相关文章:

  • 灵光一现的问题和常见错误2
  • C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序
  • Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
  • cursor/vscode启动项目connect ETIMEDOUT 127.0.0.1:xx
  • 鸿蒙ArkUI体验:Hexo博客客户端开发心得
  • JVM 调优实战入门:从 GC 日志分析到参数调优
  • 基于requests_html的python爬虫
  • Redis——缓存雪崩、击穿、穿透
  • 内容安全:使用开源框架Caffe实现上传图片进行敏感内容识别
  • HMDB51数据集划分
  • V 型不锈钢对夹球阀:高性价比流体控制的优选方案-耀圣
  • 联想笔记本黑屏了,排线出问题还是静电
  • QT调用Halcon查询所有摄像头名称
  • 遨游科普:三防平板是什么?有什么功能?
  • Linux安全篇 --firewalld
  • Windows系统永久暂停更新操作步骤
  • 微软家各种copilot的AI产品:Github copilot、Microsoft copilot
  • 什么是PMBus
  • 18-总线IIC
  • 大模型在腰椎间盘突出症预测与治疗方案制定中的应用研究
  • LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
  • 字节2025实习/校招/社招 内推码:R9SZ7Y1
  • 车载以太网驱动智能化:域控架构设计与开发实践
  • 【Ubuntu】Waydroid-Linux安卓模拟器安装
  • 【数据结构】线性表--队列
  • 自动化脚本开发:Python调用云手机API实现TikTok批量内容发布
  • 卷积神经网络中的二维卷积与三维卷积详解
  • 山东大学计算机图形学期末复习10——CG12下
  • Redis设计与实现——分布式Redis
  • 共享内存【Linux操作系统】