自定义类、元组、字典和结构体对比——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.mzph.cn/bicheng/81494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC架构模式

mvc架构是一种常见的开发模式,以下是三个核心部分 Model&#xff08;模型&#xff09;&#xff1a;负责应用程序的数据和业务逻辑。它与数据库交互&#xff0c;处理数据的存储、检索和更新&#xff0c;是应用程序的核心业务所在。View&#xff08;视图&#xff09;&#xff1a…

Python实例题:Python百行制作登陆系统

目录 Python实例题 题目 python-login-systemPython 百行登录系统脚本 代码解释 用户数据库&#xff1a; 注册功能&#xff1a; 登录功能&#xff1a; 主程序&#xff1a; 运行思路 注意事项 Python实例题 题目 Python百行制作登陆系统 python-login-systemPython…

uniapp使用全局组件,

在 Uniapp 中&#xff0c;如果你的组件是应用层组件&#xff08;例如全局悬浮按钮、全局通知栏等&#xff09;&#xff0c;并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签&#xff0c;可以通过以下两种方案实现&#xff1a; 方案一&#xff1a;通过 app.…

(8)python开发经验

文章目录 1 下载python2 pip安装依赖无法访问3 系统支持4 下载python文档5 设置虚拟环境6 编译安装python 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 下载python 下载地址尽量不要下载最新版…

【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案

&#x1f4e6; 一、整体功能定位 这是一个用于从原始视频自动生成短视频解说内容的自动化工具&#xff0c;包含&#xff1a; 视频抽帧&#xff08;可基于画面变化提取关键帧&#xff09; 多模态图像识别&#xff08;每帧图片理解&#xff09; 文案生成&#xff08;大模型生成…

每日算法刷题计划Day5 5.13:leetcode数组3道题,用时1h

11. 26. 删除有序数组中的重复项(简单&#xff0c;双指针) 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思想: 1.我的思想: 双指针遍历集合储存已有元素 2.官方思想&#xff1a; 题目条件有序数组删除重复元素&#xff0c;所以重复元素都是连续存在…

Transformer 架构在目标检测中的应用:YOLO 系列模型解析

目录 Transformer 架构在目标检测中的应用&#xff1a;YOLO 系列模型解析 一、YOLO 模型概述 二、YOLO 模型的核心架构 &#xff08;一&#xff09;主干网络 &#xff08;二&#xff09;颈部结构 &#xff08;三&#xff09;头部结构 三、YOLO 模型的工作原理 &#xf…

一个完整的项目示例:taro开发微信小程序

前一周完成了一个项目&#xff0c;体测成绩转换的工具&#xff0c;没做记录&#xff0c;。这次计划开发一个地图应用小程序&#xff0c;记录一下。方便给使用的人。 一、申请微信小程序&#xff0c;填写相应的信息&#xff0c;取得开发者ID。这个要给腾讯地图使用的。 二、申…

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

一、题目解析 frame二维矩阵中每个值代表珠宝的价值&#xff0c;现在从左上角开始拿珠宝&#xff0c;只能向右或向下拿珠宝&#xff0c;到达右下角时停止拿珠宝&#xff0c;要求拿的珠宝价值最大。 二、算法解析 1.状态表示 我们想要知道的是到达[i,j]为位置时的最大价值&am…

安装nerdctl和buildkitd脚本命令

#!/bin/bash set -euo pipefail # 检查是否以root权限运行 if [ "$(id -u)" -ne 0 ]; then echo "错误&#xff1a;请使用root权限或sudo运行本脚本" >&2 exit 1 fi # 检测openEuler系统&#xff08;兼容大小写&#xff09; detect_distrib…

实现视频分片上传 OSS

访问 OSS 有两种方式&#xff0c;本文用到的是使用临时访问凭证上传到 OSS&#xff0c;不同语言版本的代码参考&#xff1a; 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 1.安装并使用 首先我们要安装 OSS&#xff1a; npm install ali-oss --save 接着我们…

动态规划(3)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…

elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能

本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件&#xff0c;使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等&#xff0c;支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…

网络编程中的直接内存与零拷贝

本篇文章会介绍 JDK 与 Linux 网络编程中的直接内存与零拷贝的相关知识&#xff0c;最后还会介绍一下 Linux 系统与 JDK 对网络通信的实现。 1、直接内存 所有的网络通信和应用程序中&#xff08;任何语言&#xff09;&#xff0c;每个 TCP Socket 的内核中都有一个发送缓冲区…

TransmittableThreadLocal使用场景

&#x1f680; 为什么要用 TransmittableThreadLocal&#xff1f;一文读懂线程上下文传递问题 在 Java Web 开发中&#xff0c;我们经常用 ThreadLocal 来保存每个请求的用户信息&#xff0c;例如 userId。但当我们使用线程池或异步方法&#xff08;如 Async&#xff09;时&am…

Milvus(24):全文搜索、文本匹配

1 全文搜索 全文搜索是一种在文本数据集中检索包含特定术语或短语的文档&#xff0c;然后根据相关性对结果进行排序的功能。该功能克服了语义搜索的局限性&#xff08;语义搜索可能会忽略精确的术语&#xff09;&#xff0c;确保您获得最准确且与上下文最相关的结果。此外&…

2000 元以下罕见的真三色光源投影仪:雷克赛恩Cyber Pro1重新定义入门级投影体验

当性价比遇上技术瓶颈 在 2000元以下的1080P投影仪&#xff0c;单LCD 技术长期主导。而三色光源的DLP和3LCD真1080P都在4000元以上。 单LCD投影为纯白光光源&#xff0c;依赖CF滤光膜导致光效低下&#xff0c;普遍存在" 色彩失真 " 等问题。数据显示&#xff0c;该价…

Maven 下载安装与配置教程

## 1. Maven 简介 Maven 是一个项目管理和构建自动化工具&#xff0c;主要用于 Java 项目。Maven 可以帮助开发者管理项目的构建、报告和文档&#xff0c;简化项目依赖管理。 ## 2. 下载 Maven 1. 访问 Maven 官方网站 [https://maven.apache.org/download.cgi](https://maven.…

C# 深入理解类(从类的外部访问静态成员)

从类的外部访问静态成员 在前一章中&#xff0c;我们看到使用点运算符可以从类的外部访问public实例成员。点运算符由实 例名、点和成员名组成。 就像实例成员&#xff0c;静态成员也可以使用点运算符从类的外部访问。但因为没有实例&#xff0c;所以最常 用的访问静态成员的方…