部分方法
與
“
部分類
”
相關
C#
允許部分方法在部分類之內指定。 一個部分方法是方法的一個故意宣告並且在簽名上有一定的約束。 這些約束指定,如果任何類成員沒有被定義,那麼可以安全地刪除。 這個特點允許程式碼提供大量的監聽點
(
像
GoF
設計模式中的
“
模板方法
”)
而不用花費多餘時間,如果另一個類成員在編譯時沒有引用它們。而
Java
沒有對應的概念。
擴充套件方法
用一個特殊的
this
指定在一個方法的第一個引數
C#
允許這個方法扮演成第一個引數型別的一個成員函式。這個外來類的“擴充套件”是完全句法的。這個擴充套件方法需要變為靜態的,而且定義在一個完全的靜態類中。它必須服從在外部靜態方法上的任何限定,因此它不能摧毀物件封裝。這個“擴充套件”僅僅是在靜態宿主類的名稱空間被引進的範圍內是活躍的。在
java
裡面,相同的效果可以透過一個另一個類的一般方法得到,但語法將是一個函式呼叫,
而不是方法呼叫類的
C#
語法擴充套件。
發生器方法
發生器方法是一個
C#
方法 ,這個方法被宣告為返回
IEnumerable,IEnumerator
介面或者這些介面的一般版本,該方法可以用
yield
語法實現。它是一個無限的表現形式
,
編譯器生成的補遺集,可大大減少所需的程式碼遍歷或生成序列;雖然程式碼只是透過編譯器生成。這個特徵過去也經常被用作實現無窮大的序列,就像斐波那契數列。
java
是沒有相應的概念。
條件編譯
與
Java
不同,
C#
使用預編譯指令實現了條件編譯的功能。它還提供了條件屬性,使方法只有在定義了編譯常量的時候才被執行。這樣一來,只有在定義了
DEBUG
常量時,
Debug。Assert()
方法才會執行,斷言成為了
framework
的特色。從
1。4
版本開始,
Java
開始提供斷言,預設情況下在執行時被關閉,但也可以在呼叫
JVM
時使用
“-enableassertions”
或者
“-ea”
開啟。
名字空間和原始檔
C#
的名稱空間和
C++
類似,但不同於
Java
的包機制,
C#
名稱空間不會以任何方式依賴於原始檔的位置,這與
Java
不同,
Java
的常規結構要求原始檔的位置必須和包目錄結構相符。 這兩種語言都允許引入類庫
(
例
:import java。util。* ,Java
方式
)
,在引入類庫後,使用類時就可以直接透過類名引用。不同名字空間或包中可以具有相同名字的類,這樣類在使用時可以透過全限定名來引用,或者透過不同的名字只引入必要的類。基於這個問題,
Java
允許引入單個類
(
例
:import java。util。List)
。
C#
允許在引入類庫時 使用語句
: using Console = System。Console
來為一個類庫定義一個新名,它同樣允許以
using IntList = System。Collections。Generic。List
的形式,引入特殊類庫。
Java
有允許使用某些或所有,具有較短名字的靜態方法
/
領域的靜態
import
句法在類中
(
例如,允許
foo(bar)
可以從另一個類中被靜態的引進
)。C#
有靜態類句法
(
不與
Java
的靜態內在類混淆
),
制約類只包含靜態方法。
C# 3。0
介紹的引申方法允許使用者靜態地增加方法到型別
(
比如,允許
foo。bar
的地方可以是研究
foo
的種類的一個引進的引申方法
)
。
Sun Microsystems
軟體公司的
Java
編譯器要求,原始檔的檔名必須匹配在它裡面的唯一的公開類,而
C#
允許在同一個檔案的多公開類,並且投入制約。
C# 2。0
和以後的版本允許類定義被分割成幾個檔案,透過使用在原始程式碼的關鍵字
partial
。
異常處理
Java
支援檢查異常
(checked exception)
。
C
#中只支援非檢查異常情況。檢查異常強制程式設計師要麼在方法中宣告一個異常丟擲,要麼用
try-catch
來捕獲異常。檢查異常可以有助於良好的程式設計習慣,以確保所有的錯誤都得到處理。但是
Anders Hejlsberg
,
C#
語言首席設計師,和其他人爭辯說,他們都在一定程度上對
Java
進行了拓展但是它們沒有被證明是有價值的除了幾個程式中的小例子。有一個評論介紹在檢查異常時鼓勵程式設計師使用空的
catch
塊
,
安靜的吃掉異常而不是讓異常傳播到更高水平的常規的異常處理:
catch (Exception e) {}。
另一種對於檢查異常的評論說一個新方法的執行可能會引起意想不到的檢查異常被丟擲,這是一個合同突破性變化。這可能發生在一個方法實現一個介面或者當一個方法的基本實現改變時,此介面僅宣告有限的異常。為這種意料之外的的異常被丟擲
,
一些程式設計師簡單的宣告這種方法能丟擲任何型別的異常(“丟擲異常”),這使檢查異常的目的無法實現。不過在某些情況下,異常鏈(
exception chaining
)能用於代替
,
捕獲異常後再丟擲一個異常異常
。
例如
,
如果一個物件訪問資料庫而不是檔案時被改變
,
那麼可以捕獲
SQLException
異常並且作為
IOException
異常重新丟擲
。
因為呼叫者也許並不需要知道物件內部的工作方式。