[.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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...