C 2008語言特徵4 區域性方法

2021-04-25 20:15:05 字數 2411 閱讀 8982

c# 1.1

要求將類的全部**放在乙個檔案中。而

c# 2.0

允許將類或結構的定義和實現分開放在多個檔案中,這就是區域性類的概念。通過使用關鍵字

partial

來標註乙個類的各個部分,可以將各個不同的部分放在不同的檔案中。例如,可以將下面的**放到檔案

myclass1.cs

中:public partial class myclass

} 在檔案myclass2.cs 中,可以插入下面的**:

public partial class myclass

public int number;

}那麼完整的類的定義就是這兩部分的組合。區域性類是乙個非常有用的功能。有時,需要修改機器生成的檔案,例如

web

服務客戶端包裝類。然而,當重新生成此包裝類時,對該檔案的修改將會被丟棄。通過使用區域性類,可以將這些改變分開放在單獨的檔案中。

windows

窗體使用區域性類來儲存

initializecomponent

方法的視覺化設計器輸出以及成員控制項。通過使用區域性型別,兩個或者更多的開發人員可以工作在同乙個型別上。

c#2.0

支援區域性類的原理是:當編譯器構建程式集時,它將來自多個檔案的同一型別的各個部分組合起來,並用

microsoft

中間語言

(microsoft intermediate language, msil)

將這些部分編譯成單一型別。生成的

msil

中不含有哪一部分來自哪個檔案的記錄。正如在

c# 1.1

中一樣,

msil

不含有哪個檔案用於定義哪個型別的記錄。因為編譯器所做的只是將各個部分累積,所以乙個單獨的檔案可以包含多個部分,甚至是包含同一型別的多個部分。

在c#

中,開發人員通常根據檔案所包含的類來為檔案命名,這樣可以避免將多個類放在同乙個檔案中。在使用區域性型別時,建議在檔名中指示此檔案包含哪個類的哪些部分(例如

myclassp1.cs

、myclassp2.cs

),或者採用其他一致的方式從外形上指示原始檔的內容。例如,

windows

窗體設計人員將用於該窗體的區域性類的一部分存放在

form1.cs

中,並將此檔案命名為

form1.designer.cs

。區域性類的乙個不利之處是,當開始接觸乙個不熟悉的**集時,您所維護型別的各個部分可能遍布在整個專案的檔案中。在這種情況下,建議您使用

visual studio class view

,因為它可以將乙個類的所有部分積累起來展示給您,並允許您通過單擊它的成員來導航各個不同的部分。

在c#3.0中微軟對這一特性進行了擴充套件,引入了區域性方法的概念。區域性方法允許在類的一部分宣告乙個方法或乙個事件,而在類的另一部分實現這個方法或事件,在宣告這個方法或事件之後,在類的另一部分可以實現也可以不實現。如果宣告了區域性方法而沒有在類的另一部分實現。編譯器編譯時將刪除區域性方法的宣告和所有對這個方法呼叫的**。

下面介紹一下區域性方法的規則:

1. 區域性方法必須用partial關鍵字作為修飾符,返回型別必須是void。

2. 區域性方法可以有ref引數,但不能有out引數。

3. 區域性方法是private的,所以不能用virtual,public等修飾。

4. 區域性方法不能是extern的。

5. 區域性方法可以有static和unsafe修飾符。

6. 在宣告中的引數的名稱不必和區域性方法的定義時的一樣,但型別必須匹配。

7. 不能用delegate。

例子partialmethod演示了乙個區域性方法。在檔案program.cs中放有**

namespace

partialmethod

//////

區域性方法

mypartialmethod

的宣告部分

///

///整型

static

partial

void mypartialmethod(int i); }

}檔案program2.cs中放有**

namespace

partialmethod

", k); }

} }程式編譯執行後,使用reflector工具檢視如圖9-10所示:

圖9-10

如果將program2.cs刪除掉,也就是只保留

mypartialmethod

的宣告部分,而沒有方法的實現部分。程式也能編譯通過,但是螢幕上面沒有任何的輸出,使用工具

reflector

檢視生成的**。看到main函式的**如圖9-11所示:

圖9-11

所以,讓區域性方法只有宣告的時候,編譯器將會刪除區域性方法的宣告和所有對這個方法呼叫的**。

C 2008核心程式設計 2013 09 14

using指令必須放在命名空間第乙個成員之前。析構函式不能在原始碼中直接被呼叫,而是在垃圾 期間被呼叫。classname 被finalize 呼叫。自動實現的屬性,必須提供get和set.public int age 巢狀型別。partial類。每個分部類的前面有partial關鍵字 每個分部類有...

C 2008核心程式設計(20130713)

c 2008引入了一些新的東西如linq wcf wpf,其中由linq引入的新的特徵包括lambda表示式 擴充套件方法 表示式樹 表示式目錄樹 匿名物件 隱式型別等。每個原始檔都是乙個編譯單元 using 指令 隱式的使用命名空間,為命名空間建立別名。using指令必須放在乙個命名空間內的第乙個...

C2008 獲取檔名的 碟符 檔案路徑 副檔名

vc2008 獲取檔名的 碟符 檔案路徑 副檔名 include stdafx.h include stdlib.h int tmain int argc,tchar ar printf 用 makepath s 合成的路徑 n s n n path buffer err splitpath s p...