自定义类、元组、字典和结构体对比——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
参数。
劣势
- 语义模糊:元组元素通过
Item1
、Item2
访问,可读性较差(除非使用命名元组)。 - 不可变性:默认不可变(除非使用
ValueTuple
),修改需创建新元组。 - 功能有限:无法添加方法或属性,仅作为数据容器。
适用场景
- 临时数据关联(如方法返回多个值)。
- 简单的键值对(如字典的键)。
- 代码简洁性优先的场景。
示例(CAD 点与实体关联)
// 使用命名元组
var pointEntityPair = (point: new Point3d(1, 2, 0), entity: GetEntity());
3. 字典(Dictionary)
优势
- 高效查找:基于哈希表实现,查找、插入和删除操作的时间复杂度为 O (1)。
- 键值对结构:适合建立对象之间的映射关系(如 ID → 实体、图层 → 实体列表)。
- 动态扩展:可以随时添加或删除键值对。
劣势
- 类型约束:键必须唯一,且需正确实现
Equals
和GetHashCode
。 - 无序性:默认不保证元素顺序(除非使用
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. 自定义类:表示实体关系
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 开发中,合理组合这些结构可以平衡代码的可读性、性能和可维护性。
相关文章:
自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系
以下是对它们的详细分析和对比: 1. 自定义类(Class) 优势 封装性强:可以定义字段、属性、方法和事件,实现复杂的行为和逻辑。继承与多态:支持继承体系,可通过接口或抽象类实现多态。引用类型…...
鸿蒙北向源码开发: 检查应用接口dts文件api规范性
开源鸿蒙5.0.2对应的api版本是14 5.0社区仓有工具检查接口规范性报告工具: interface/sdk-js/build-tools/api_check_plugin api_check_plugin是什么? 在解释api_check_plugin是什么之前得先知道 应用调用的api接口都是文件名后缀为.d.ts的文件,这些文件内部声明了arkts的a…...
谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频
近期,谷歌旗下的 NotebookLM 即将推出一项令人瞩目的新功能 ——Sparks 视频概览。这一功能借助 Gemini 与 Deep Research 的强大能力,能够生成 1 - 3 分钟的 AI 视频,为用户带来全新的内容创作与信息获取体验。 NotebookLM:AI 笔…...
5月19日笔记
BGP的路由聚合 BGP(Border Gateway Protocol,边界网关协议)是互联网中用于在不同自治系统(AS)之间交换路由信息的一种协议。在BGP中,路由聚合是一种技术,它允许网络管理员通过减少路由表中冗余的…...
从基础到高级:网站反爬技术全景解析与第三方工具对比
网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...
Java面试实战:从Spring Boot到分布式缓存的深度探索
Java面试实战:从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂,面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信,迎接这场技术“拷问”。 第一轮:基础问题 老王&#…...

职坐标AIoT技能培训课程实战解析
职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…...
pytorch小记(二十):深入解析 PyTorch 的 `torch.randn_like`:原理、参数与实战示例
pytorch小记(二十):深入解析 PyTorch 的 torch.randn_like:原理、参数与实战示例 一、函数签名与参数详解二、torch.randn_like vs torch.randn三、基础示例四、进阶用法与参数覆盖4.1 覆盖数据类型(dtype)…...
小结:网页性能优化
网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。 1. 优化加载阶段 减少关键资源请求: 合并CSS/JS文件&a…...

8-游戏详情制作(Navigation组件)
1.1 需求 使用Navigation实现游戏主详情视图,从瀑布流容器中的游戏项(游戏中心首页-游戏瀑布流列表)点击游戏后进入游戏详情页,从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入: 游戏详情&#…...

Unity引擎源码-物理系统详解-其二
继续我们关于Unity的物理系统的源码阅读,不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下:NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…...

1.3.3 数据共享、汇聚和使用中的安全目标
探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…...

【Docker】Docker安装Redis
目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新,如需下载指定版本可带版本号 docker pull redis:xxx 响应内容: 1.1查看下载的镜像 下载完…...

Oc语言学习 —— Foundation框架总结
1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象,例如:NSString *str "hello"; 因为我们的NSString是不可变的,所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…...
react+html2canvas+jspdf将页面导出pdf
主要使用html2canvasjspdf 1.将前端页面导出为pdf 2.处理导出后图表的截断问题 export default function AIReport() {const handleExport async () > {try {// 需要导出的内容idconst element document.querySelector(#AI-REPORT-CONTAINER);if (!element) {message.err…...

LWIP的Socket接口
Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…...
基于支持向量机(SVM)的P300检测分类
基于支持向量机(SVM)的P300检测分类MATLAB实现,包含数据预处理、特征提取和分类评估流程: %% P300检测分类完整流程(SVM实现) clc; clear; close all;%% 1. 数据加载与模拟生成(实际应用需替换…...
Better Faster Large Language Models via Multi-token Prediction 原理
目录 模型结构: Memory-efficient implementation: 实验: 1. 在大规模模型上效果显著: 2. 在不同类型任务上的效果: 为什么MLP对效果有提升的几点猜测: 1. 并非所有token对生成质量的影响相同 2. 关…...
51c嵌入式※~合集7~Linux
我自己的原文哦~ https://blog.51cto.com/whaosoft/13926843 一、u-boot和bootloader~区别 Bootloader 比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那…...

Spring的Validation,这是一套基于注解的权限校验框架
为了保证数据的正确性、完整性,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器,处理校验异常 RestControllerAdvice p…...

MySQL - 如何突破单库性能瓶颈
数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的,服务器是数据库的宿主,其性能直接影响了数据库的性能,所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…...
基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
在开发一个社交分享平台时,图片上传功能是核心需求之一。本文将基于一个旅拍社交分享系统,详细解析其图片上传功能的实现原理和技术细节,包括前端处理、后端接收和数据库存储等环节。 1. 前端图片上传实现 在这个项目中,图片上传…...
go封装将所有数字类型转浮点型,可设置保留几位小数
封装转换方法 /* * * 将类型转浮点型,并保留小数 ToFloat(123, 2) ToFloat(3.5254, 0) */ func ToFloat(value interface{}, precision int) (float64, error) {var f float64var err errorswitch v : value.(type) {case float64:f vcase float32:f float64(v)c…...
Rust 学习笔记:关于 Vector 的练习题
Rust 学习笔记:关于 Vector 的练习题 Rust 学习笔记:关于 Vector 的练习题哪个调用会报错?以下代码能否通过编译?若能,输出是?以下代码能否通过编译?若能,输出是?以下代码…...
Linux 系统异常触发后自动重启配置指南
Linux 系统异常触发后自动重启配置指南 一、内核级自动重启配置 适用于内核崩溃(Kernel Panic)、硬件驱动故障等场景,通过 SysRq 和 Watchdog 实现快速恢复。 1. SysRq 强制重启 功能:通过触发内核崩溃或强制重启,绕…...

apisix透传客户端真实IP(real-ip插件)
文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses?安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LBÿ…...

Oracle 数据库的默认隔离级别
Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…...
统计客户端使用情况,使用es存储数据,实现去重以及计数
这篇文件的重点在tshark、filebeat、和logstash。 需求:统计客户使用的客户端版本 实现工具:tshark 1.10.14,filebeat 8.17.0,logstash 8.17.0,elasticsearch 8.17.0,kibana 8.17.0 总体设计:…...

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I
每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra(…...
oracle序列自增问题
1.先查询表名对应的序列名称 SELECT trigger_name, trigger_type, triggering_event FROM all_triggers WHERE table_name 表名;2. 查询id最大值 SELECT MAX(ID) FROM 表名;3. 查询下一次生成ID SELECT SJCJ_ENERGY_DATA_INSERTID.NEXTVAL FROM DUAL;4. 设置临时步长,越过…...