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

news2025/5/21 5:06:34

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

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.coloradmin.cn/o/2380455.html

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

相关文章

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心&#xff0c;构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路&#xff0c;通过分层递进的知识模块帮助学员建立系统…

8-游戏详情制作(Navigation组件)

1.1 需求 使用Navigation实现游戏主详情视图&#xff0c;从瀑布流容器中的游戏项&#xff08;游戏中心首页-游戏瀑布流列表&#xff09;点击游戏后进入游戏详情页&#xff0c;从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入&#xff1a; 游戏详情&#…

Unity引擎源码-物理系统详解-其二

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

1.3.3 数据共享、汇聚和使用中的安全目标

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

【Docker】Docker安装Redis

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

Oc语言学习 —— Foundation框架总结

1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象&#xff0c;例如&#xff1a;NSString *str "hello"; 因为我们的NSString是不可变的&#xff0c;所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口&#xff0c;通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口&#xff0c;但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性&#xff0c;作为一名后端开发工程师&#xff0c;不能仅仅依靠前端来校验数据&#xff0c;还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器&#xff0c;处理校验异常 RestControllerAdvice p…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的&#xff0c;服务器是数据库的宿主&#xff0c;其性能直接影响了数据库的性能&#xff0c;所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

apisix透传客户端真实IP(real-ip插件)

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

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别&#xff1a;READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别&#xff0c;这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天&#xff0c;今天是dijkstra&#xff08;堆优化版&#xff09;以及Bellman_ford &#xff0c;尝试理解中&#xff0c;属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

开启健康生活的多元养生之道

健康养生是一门值得终身学习的学问&#xff0c;在追求健康的道路上&#xff0c;除了常见方法&#xff0c;还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道&#xff0c;能让我们的生活更健康、更有品质。​ 室内环境的健康不容忽视。定期清洁空调滤网&#xff0c;避…

【Vite】前端开发服务器的配置

定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…

Spring Security与Spring Boot集成原理

Spring Security依赖的是过滤器机制&#xff0c;首先是web容器例如tomcat作为独立的产品&#xff0c;本身有自己的一套过滤器机制用来处理请求&#xff0c;那么如何将tomcat接收到的请求转入到Spring Security的处理逻辑呢&#xff1f;spring充分采用了tomcat的拓展机制提供了t…

VScode各文件转化为PDF的方法

文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…

Vue3学习(组合式API——Watch侦听器、watchEffect()详解)

目录 一、Watch侦听器。 &#xff08;1&#xff09;侦听单个数据。 &#xff08;2&#xff09;侦听多个数据。&#xff08;数组写法&#xff1f;&#xff01;&#xff09; &#xff08;3&#xff09;immediate参数。(立即执行回调) &#xff08;3&#xff09;deep参数。(深层监…

【node.js】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的特点1.2 Node.js架构 2. Node.js安装2.1 下载和安装方法2.1.1 Windows安装2.1.2 macOS安装2.1.3 Linux安装 2.2 使用NVM安装和管理Node.js版本2.2.1 安装NVM2.2.2 使用NVM管理Node…

《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架

第62篇&#xff1a;TypeChat——类型安全的大模型编程框架 摘要 在构建 AI 应用时&#xff0c;一个常见的痛点是大语言模型&#xff08;LLM&#xff09;输出的不确定性与格式不一致问题。开发者往往需要手动解析、校验和处理模型返回的内容&#xff0c;这不仅增加了开发成本&a…