自定義類、元組、字典和結構體對比——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.pswp.cn/bicheng/81494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81494.shtml
英文地址,請注明出處:http://en.pswp.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;所以最常 用的訪問靜態成員的方…