C#分部類型解析

来源:http://www.cnblogs.com/pengze0902/archive/2017/02/06/6369541.html
-Advertisement-
Play Games

等待著元宵節的到來,過完元宵,這個年也算是過完了,也得開始出去掙錢了,過年回家感覺每個人都覺得很牛,只有自己太渣,為了避免年底再出現這樣尷尬的局面,還是需要努力幹活。爭取當上CEO,贏取白富美,走上人生巔峰。(生活需要幻想,也需要面對現實,努力獲取一個向上的心態,比起擁有財富要更加的難得。) 對於現 ...


   等待著元宵節的到來,過完元宵,這個年也算是過完了,也得開始出去掙錢了,過年回家感覺每個人都覺得很牛,只有自己太渣,為了避免年底再出現這樣尷尬的局面,還是需要努力幹活。爭取當上CEO,贏取白富美,走上人生巔峰。(生活需要幻想,也需要面對現實,努力獲取一個向上的心態,比起擁有財富要更加的難得。)

  

     對於現在還在聊QQ和看博客的同志們,我只想借用上圖問一句“你們不上班麽?...哈哈哈...”。好了,不扯淡了,開始我們今天的主題。

     C#的類型中,我們知道最多的就是靜態類,對於靜態類的一些特性在這裡就不做介紹了,因為對於一個.NET開發者來說,靜態類的一些特性應該是有一定的掌握,並且在項目中應用的也是非常多。現在需要介紹的是另一種類型,那就是“分部類型”,對於“分部類型”的瞭解,很多人估計也就是知道而已,接下來就讓我們一起來學習一個“分部類型”這一C#的語言特點。

一.C#分部類型和分部方法解析:

   1.分部類型概述:

     學習“分部類型”,我們還是先來瞭解一下什麼叫做“分部類型”。分部類型是指可以在多個源文件中為一個類型編寫代碼。對於分部類型的使用場景,使用最多的地方是部分代碼是自動生成,而其他部分的代碼為手寫的類型。“分部類型”是由C#2.0時引入的。在繼承鏈上存在一個不必要的鏈接,會引發某些問題或降低封裝型。

     我們現在對於分部類型的定義有一個大致的瞭解,以及對分部類型的應用場景也有一個初步的瞭解,接下來我們來看一下如何創建分部類型和分部類型的使用方法。

   2.分部類型的創建和使用方法:

       如果需要創建分部類型,我們只需要在涉及的每個文件的類型的聲明部分添加一個上下文關鍵字partial。對於分部類型,編譯器在編譯之前就把所有的文件合併在一起了。在一個文件中代碼可以調用另外一個文件中的代碼。有如下代碼:

   SegmentType1.cs:

 partial class SegmentType
    {
        private void Add()
        {
            Update();
        }

        private void Delete()
        {
        }
    }

 SegmentType2.cs

  partial class SegmentType
    {
        private void Update()
        {
            Delete();
        }
    }

    以上是對分部類型做了一個簡單的申明和應用,這兩個.CS文件在編譯器編譯之前就已經合併在一起了。對於分部類型不能在一個文件中編寫成員的一半代碼,而把另外一半代碼放到另外一個文件中,必須保證每個獨立的成員必須完整地位於它所處的文件中。如下代碼:

  SegmentType1.cs:

    partial class SegmentType
    {
        private void Add(string fileName)
        {
            FileStream fs = null;
            try
            {
                fs = File.Create(fileName);
            }           
        }
    }

SegmentType2.cs

 partial class SegmentType
    {
        private void Update()
        {
            Add();
            catch (ArgumentException arex)
            {
                throw arex;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }
    }

   上面演示的做法是無法通過編譯的。

   對於類型的聲明還有一些限制,那就是聲明必須要相互相容,任何文件都能指定要實現的介面和基類型,以及類型參數的約束。如果多個文件都設定了基類型,那麼它們必須是相同的,並且如果多個文件都設定了類型參數約束,那麼約束必須是一致的。有如下代碼實例:

  SegmentType1.cs:

    //介面約束:IEquatable<string>;
    //where TFirst:class :和類型參數約束
    partial class SegmentType<TFirst,TSecond>:IEquatable<string> where TFirst:class 
    {
        //實現IEquatable<string>介面方法
        public bool Equals(string other)
        {
            return false;
        }
    }

SegmentType2.cs

    //指定基類:EventArgs
    //指定介面:IDisposable
    partial class SegmentType<TFirst, TSecond> :EventArgs,IDisposable
    {
        //實現方法
        public void Dispose()
        {
        }
    }

  以上的介面和基類約束中,也可以使用如下方法:

 SegmentType1.cs:

    //介面約束:IEquatable<string>;
    //where TFirst:class :和類型參數約束
    partial class SegmentType<TFirst,TSecond>:IEquatable<string> where TFirst:class 
    {
        //實現方法
        public void Dispose()
        {
        }
    }

SegmentType2.cs

    //指定基類:EventArgs
    //指定介面:IDisposable
    partial class SegmentType<TFirst, TSecond> :EventArgs,IDisposable
    {
        //實現IEquatable<string>介面方法
        public bool Equals(string other)
        {
            return false;
        }
    }

   對於介面和基類型約束可以進行交換,基於這種特性,可以將指定的介面與實現分離,將為不同類型生成相同的簽名的方法封裝到一個介面中。無法在聲明類型時指定其實現了該介面。

   以上是主要講解了分部類型的創建和使用方式,接下來我們再來瞭解一下分部方法的相關知識。

 3.分部方法解析:

   對於分部方法的相關概念,在前面介紹分部類型時已經做了介紹,分部方法的創建和使用與分部類型類似。分部方法有一個特點:任何對未實現的分部方法的調用,都會被編譯器移除。

  分部方法的聲明與抽象方法的申明類似,只需要使用partial修飾符提供簽名而無須任何實現。實現也需要partial修飾符進行修飾。有如下代碼:

 SegmentType1.cs:

 partial class SegmentType
    {
        public SegmentType()
        {
            SegmentTypeStart();
            Console.WriteLine("分部方法解析...");
            SegmentTypeEnd();
        }

        partial void SegmentTypeStart();

        partial void SegmentTypeEnd();
    }

SegmentType2.cs

  partial class SegmentType
    {
        partial void SegmentTypeStart()
        {
            Console.WriteLine("分部方法開始...");
        }
    }

   在分部方法中,由於方法可能不存在,所以分部方法返回類型必須聲明為void,且不能獲取out參數。分部方法必須是私有的,但是是靜態的或是泛型。

二.C#分部類型和分部方法的特點:

   上面介紹了分部類型和分部方法的定義、創建和使用方式,在這裡主要介紹一下分部方法和分部類型的特點。分部類型主要連接設計器和其他代碼生成器。利用分部類型模型,代碼生成器可以擁有自由的操作文件,或者只要它願意可以每次都重寫整個文件。

   某些代碼生成器還可以選擇不生成任何C#文件,而是等到構建進行的時候再生成。代碼生成器的應用比較的廣泛,比如Web伺服器代理、ORM工具生成配置文件等等。對於在ORM工具的應用有如下圖:

   

   分部類型在其他方面也有比較多的使用,分部類型可以輔助我們進行重構。(重構的第一步就是將比較大的類型分成較小的類,很多的關聯的內容首先就可以分割為在兩個或多個文件上存放的分部類型。)

   分部類型也可以幫助我們進單元測試。

   分部方法能在手動創建的文件中指定某種行為,併在自動生成的文件中使用該行為。

三.C#分部類型實例:

   分部類型和分部方法是一個語言特性,在這裡給出一個使用了分部類型的項目。https://github.com/fiidau/Phasing-Utility

四.總結:

     對於分部類型和分部方法的介紹還有很多,在本文中只是做了一個簡單的介紹,分佈類型的使用也是比較的廣泛,可以極大的提升我們的代碼質量。希望本文對大家有所幫助。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 概述 依賴屬性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一種特殊的屬性。由於UWP的幾乎所有UI元素都是集成於DependencyObject的FramewordElement,並且這些UI元素的幾乎所有屬性及它們出現在XAML中的 ...
  • 本篇博客轉載:http://www.cnblogs.com/freeliver54/archive/2009/02/11/1388173.html 本次示例效果如下:Form1為父窗體(包含textBox1、button1)Form2為子窗體(包含textBox2、button2) 父窗體給子窗體傳 ...
  • 和大家分享下當前OSS開源項目的進度情況: 一. OSS.Common 【開源中國】 【github】 經過昨天的努力,oss.common項目初步完成了對.net standard的支持,遷移過程本周以新文章的形式開放給大家,當前解決方案有兩個: OSS.Common.NET40 - 針對原來.n ...
  • .net體系經過十幾年發展,發生了很多變化。特別是在最近兩年,隨著開源和跨平臺的發展,衍生出很多概念,像標準庫,可移植庫,.Net Core等,相信有不少同學對他們之間的關係是有一些困惑的,這裡我從基礎概念,跨框架開發的註意事項等,對.net的平臺和相關概念做一個普及分享。此分享是從個人的知識體系中 ...
  • ServerSuperIO 3.2版本以前,設備數據僅支持Xml序列化的方式,如果以其他方式存儲數據,那麼只能把持久化操作寫在設備驅動中,本質上失去了模塊化的靈活性。3.2 版本以後增加了數據持久化介面,方便支持多種形式存儲設備的參數數據和實時數據,3.2版本里現在僅支持Xml序列化的方式,後期會支... ...
  • "ABP入門系列目錄——學習Abp框架之實操演練" "源碼路徑:Github LearningMpaAbp" 一、AbpSession是Session嗎? 1、首先來看看它們分別對應的類型是什麼? 查看源碼發現 是定義在Controller中的類型為 的屬性。 再來看看 是何須類也,咱們定位到 中看 ...
  • ThreadPool線程池的主要方法: 1. public static Boolean QueueUserWorkItem(WaitCallback wc, Object state); WaitCallback回調函數:通過將一些回調函數放入線程池中讓其形成隊列,然後線程池會自動創建或者復用線程 ...
  • 委托是一個類型。C#中的委托是面向對象的,並且它是類型安全的 當創建委托實例的時候,創建的實例會包含一個調用列表,在調用列表中可以包含多個方法。每個方法稱作一個調用實體。調用實體可以是靜態方法,也可以是實例方法。如果是實例方法,則該調用實體包含調用該實例方法的實例。委托並不關心它所調用方法所屬的類, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...