[.NET] 《Effective C#》快速筆記 - C# 高效編程要點補充

来源:http://www.cnblogs.com/liqingwen/archive/2017/05/08/6827546.html
-Advertisement-
Play Games

《Effective C#》快速筆記 - C# 高效編程要點補充 目錄 四十五、儘量減少裝箱拆箱 四十六、為應用程式創建專門的異常類 四十七、使用強異常安全保證 四十八、儘量使用安全的代碼 四十九、實現與 CLS 相容的程式集 五十、實現小尺寸、高內聚的程式集 這是這一系列的最後一篇。 四十五、儘量 ...


《Effective C#》快速筆記 - C# 高效編程要點補充

 

目錄

  • 四十五、儘量減少裝箱拆箱

  • 四十六、為應用程式創建專門的異常類

  • 四十七、使用強異常安全保證

  • 四十八、儘量使用安全的代碼

  • 四十九、實現與 CLS 相容的程式集

  • 五十、實現小尺寸、高內聚的程式集

 

  這是該系列的最後一篇。也許有些理論有可能會過時,我想它仍有存在的必要,人的知識水平也是一個不斷成長的過程,學會站在前人的肩膀上,嘗試不斷的借鑒與總結。

 

四十五、儘量減少裝箱拆箱

  1. 值類型是數據的容器,不支持多態。

  2. 裝箱把一個值類型放在一個未確定類型的引用對象中,讓該值作為引用類型所使用。拆箱指從引用類型的位置取出值的一個副本。

  3. 裝箱和拆箱會在無意中創建許多副本,導致許多難以發現的 Bug。

  4. 使用介面而不是使用類型可以避免裝箱,即將值類型從介面實現,然後通過介面調用成員。

  5. 裝箱拆箱都是比較影響性能的手段,應該儘可能的避免裝拆箱操作。

  6. 泛型可以避免裝拆箱操作。

  7. 值類型裝箱是隱式的,難以發現,需要自己多加註意。

 

  這裡是一篇較為詳細的關於裝拆箱的博文:《裝箱與拆箱》

 

四十六、為應用程式創建專門的異常類

  1.只有當用戶會以不同的形式去處理錯誤時,才應該創建不同的異常類。

  2.自定義的異常類應該以“Exception”結尾,並且繼承 System.Exception 或其他異常類。不過你也需要適當地包含該基類中的構造函數,內容直接交給基類實現即可。

    /// <summary>
    /// 自定義的異常類
    /// </summary>
    public class MyException : Exception
    {
        public MyException() : base()
        {

        }

        public MyException(string s) : base(s)
        {

        }

        public MyException(string s, Exception e) : base(s, e)
        {

        }

        protected MyException(SerializationInfo info, StreamingContext cxt) : base(info, cxt)
        {
            
        }
    }

 

  3.在拋出自定義的異常時,應該將原始的異常存放在 InnerException 屬性中,這樣就可以顯示足夠友好,並且信息豐富的異常:

        public void Do()
        {
            try
            {
                //DoException();
            }
            catch (DoException e)
            {
                var msg = $"該問題是博主故意引起的";
                throw new MyException(msg, e);
            }
        }

 

  4.只有在存在不同類型的恢復操作時,才應該拋出不同類型的異常,定義異常類時,還要提供基類中支持的所有構造函數。此外,不要忘記使用 InnerException 屬性來保存低層次的異常信息。

 

四十七、使用強異常安全保證

  1.Dave Abrahams 定義了 3 種安全異常來保證程式:基礎保證、強保證,以及無拋出保證。

  2.強異常保證:從異常中恢復和簡化異常處理之間提供了一個平衡點,如果一個操作因為某個異常中斷,程式將維持原狀態不變,操作要麼徹底完成,要麼就不會修改程式的任何狀態。強異常保證的好處:任何時候若是捕獲了異常,所有將要嘗試的正常操作都不繼續進行。程式當前的狀態如尚未開始進行該操作一樣。

  3.對將要修改的數據做防禦性的複製,對這些數據的防禦性複製進行修改,這中間的操作可能會引發異常,在出現異常時可將臨時副本和原對象進行交換。

  4.終結器、Dispose() 方法和委托對象所綁定的目標方法在任何情況下都應當確保他們不會拋出異常。

 

四十八、儘量使用安全的代碼

  1. .NET 運行時可以保證一些懷有惡意的代碼不能直接滲透到遠程電腦上執行。

  2. CLR 中的帶有代碼的訪問安全設置,如:CLR 強制要求基於角色的安全認證,這樣才能判斷某些代碼能否在基於一個特定的角色賬號下運行。

  3. CLR 可以檢查 IL 代碼,確保它不存在潛在的危險行為。如:直接訪問原始記憶體。

  4. 如果代碼不需要任何的安全許可權,就不需要使用 CAS 的 API 來判斷訪問許可權,因為這樣只會影響性能,額外增加 CLR 的工作量。

  5. 你可以使用 CAS 的 API 來訪問一些受保護的資源,一般需要額外的許可權。如非托管的記憶體和文件系統、註冊表等。

  6. 一般來說,我們編寫的 C# 代碼都是安全的,除非你使用了 /unsafe。

  7. 應該儘可能地避免訪問非托管記憶體。確實有需要的話,應該將其隔離在獨立的程式集中。

 

四十九、實現與 CLS 相容的程式集

  1..NET 運行環境與語言無關,我們創建的程式集必須與 CLS 保持相容,這樣才能保證其他的開發人員可以用另一種語言來調用你的組件。

 

五十、實現小尺寸、高內聚的程式集

  1. 如果我們都將所有的代碼放在一個程式集中,這不利於組件的重用,也不利於系統的局部更新,若是可以將其拆分成小程式集,以組件的形式進行重用,就可以從一定程度上簡化後續的開發工作。

  2. 我們用類進行功能的封裝和數據的存儲,只有公有的類、結構和介面才應該稱為契約,被其它用戶(或程式集)進行訪問。

  3. 建議將程式拆分成多個程式集,把相關的類型放在同一個程式集中。

  4. 一個程式集應該是一個包含相關功能的,具有良好組織的一個庫。如果不知道怎樣的顆粒度最好,可以略微向小而多的方向傾斜。

  5. 如果所有參數和返回值都是介面,那麼任何一個程式集都可以很容易地用另一個實現了相同介面的程式集進行代替。

  6. 更小的程式集同樣可以降低程式啟動時的開銷。更大的程式集要花上更多的 CPU 時間來載入,且需要更多的時間來將必須的 IL 編譯成機器指令。雖然只有啟動時將被調用的代碼會被 JIT 編譯,但程式集是整體載入的。

  7. 在跨越程式集時,安全性檢查會成為一個額外的開銷。程式跨越程式集的次數越小,其執行效率越高。

  8. 性能的損耗對我們來說可以忽略不計,因為在開發時,我們著重的是代碼的靈活度,所以不需要擔心將大程式集拆分成小程式集的性能問題。

  9. 常見的程式集:小且僅專註於某個特定功能的程式集,大一些但包含通用功能的程式集。無論何種情況,都應該保證其儘可能合理的小,但不應該過度。

 

本系列

  《Effective C#》快速筆記(一)- C# 語言習慣

  《Effective C#》快速筆記(二)- .NET 資源托管

  《Effective C#》快速筆記(三)- 使用 C# 表達設計

  《Effective C#》快速筆記(四) - 使用框架

  《Effective C#》快速筆記(五) - C# 中的動態編程

  《Effective C#》快速筆記(六) - C# 高效編程要點補充

 

 


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6827546.html 

【參考】《Effective C#》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:學習通配符有點為正則表達式打基礎的感覺……之前學python有學過正則表達式,所以這篇博客學起來還是挺快的。 特殊符號 通配符 他是shell的內置功能通配符,用過DOS的應該很瞭解,也很常用。通配符,指包含這些字元的字元串“?”,“*”,“[]”,{} 通配符含義 >匹配文件名 通配符詳解 ...
  • 不同的軟體的安裝方法是並不相同的。有的軟體只能通過特定的方法來安裝。 在不同的Linux發行版本上安裝同一個軟體的方法也未必相同, 因此有的時候,你在網上找到的在Ubuntu上安裝某個軟體的方法,也許在CentOS上並不能成功。 RPM、YUM、dpkg、apt-get、aptitude ...
  • Linux GSO邏輯分析 ——lvyilong316 (註:kernel版本linux 2.6.32) GSO用來擴展之前的TSO,目前已經併入upstream內核。TSO只能支持tcp協議,而GSO可以支持tcpv4, tcpv6, udp等協議。在GSO之前,skb_shinfo(skb)有兩 ...
  • 文件屬性概述(ls -lhi) linux里一切皆文件Linux系統中的文件或目錄的屬性主要包括:索引節點(inode),文件類型,許可權屬性,鏈接數,所歸屬的用戶和用戶組,最近修改時間等內容: 解釋: 第一列:inode索引節點編號(相當於人的身份證,全國唯一)第二列:文件類型及許可權第二列共11個字 ...
  • Download opencv https://github.com/opencv/opencv/tree/2.4 安裝必要的依賴 Enter opencv dirctory and install cmake 出錯,報錯如下 根據報錯信息,應該是qt沒裝 安裝qt cmake成功會生成如下文件 t ...
  • 廣義的網站的監控涵蓋所有的非業務行為的數據採集與管理,包括數據分析師和產品設計師使用的網站用戶行為日誌、業務運行數據,以及供運維工程師和開發工程師使用的性能統計數據等。 本文主要是通過shell腳本來收集伺服器性能指標,如系統load、記憶體占用、磁碟IO、CPU占用,並將其寫入一個文件中,及時判斷應 ...
  • 最近做了一個使用 C# 寫了一個發送郵件的 windows 服務,在這裡記錄一下。 首先使用 Visual Studio 2015 創建一個 windows 服務項目。 然後在設計器上面右擊添加安裝程式。如下圖。 安裝好後,選擇安裝程式設計界面,選擇服務和安裝程式右擊選擇屬性修改一些屬性值。 PS: ...
  • 文檔目錄 本節內容: 簡介 IObjectMapper 介面 集成 AutoMapper 安裝 創建映射 自動映射的特性 自定義映射 擴展方法 MapTo 單元測試 預定義的映射 LocalizableString -> string 註入 IMapper 安裝 創建映射 自動映射的特性 自定義映射 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...