一.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
四.總結:
對於部分型別和分部方法的介紹還有很多,在本文中只是做了一個簡單的介紹,分佈類型的使用也是比較的廣泛,可以極大的提升我們的代碼品質。 希望本文對大家有所説明。
留言列表