2009-09-15 28 views
9

具體來說,任何人都可以給我具體的例子,何時何時不使用嵌套類?什麼時候你想在C#中嵌套類?

我已經知道此功能,因爲永遠,但從來沒有理由使用它。

謝謝。

+0

類似的問題 - http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you – Nate 2009-09-15 15:51:52

回答

16

當嵌套類僅由外部類使用時,不再需要的一個很好的示例是針對集合的枚舉類。

另一個例子可能是一個枚舉代替類中使用的方法,以澄清調用簽名真假參數...

,而不是

public class Product 
{ 
    public void AmountInInventory(int warehouseId, bool includeReturns) 
    { 
     int totalCount = CountOfNewItems(); 
     if (includeReturns) 
      totalCount+= CountOfReturnedItems(); 
     return totalCount; 
    } 
} 

product P = new Product(); 
    int TotalInventory = P.AmountInInventory(123, true); 

這使得它不清楚「真」意味着什麼,你可以寫:

public class Product 
{ 
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 } 
    public void AmountInInventory(int warehouseId, Include include) 
    { 
     int totalCount = 0; 
     if ((include & Include.New) == Include.New) 
      totalCount += CountOfNewItems(); 
     if ((include & Include.Returns) == Include.Returns) 
      totalCount += CountOfReturns(); 
     return totalCount; 
    } 
} 


    product P = new Product(); 
    int TotalInventory = P.AmountInInventory(123, Product.Include.All); 

這使參數值在客戶端代碼中清除。

2

我見過只在一個類中使用特殊用途數據結構或者只在一個類中引發和捕獲某個異常的嵌套類的情況。

11

這兩個地方我用嵌套類:

  • 嵌套類是通過外部類的專用了,我要完全私人的範圍。

  • 嵌套類專門用於實現在別處定義的接口。例如,實現一個枚舉器就屬於這一類。

3

我有時使用這個簡單的輔助類,我需要一個函數或兩個父類的內部。

1

當我有一個輔助類時,我不需要對系統中的任何其他對象可見,就可以嵌套類。這樣可以儘可能地限制可見性,這有助於防止類別的意外使用

4

如果您確定嵌套類沒有意義,那麼在其他任何地方都可以使用它,您真的只想使用嵌套類。例如,如果您需要創建一個包含關於該對象集合的函數和成員信息的幾種類型的對象的列表(例如方法或屬性),那麼您可以使用嵌套類來完成那。也許你需要創建一個對象類型的所有組合列表,然後標記具有某個屬性的所有組合。對於嵌套類來說,這將是一個很好的例子。

如果你不需要嵌套類的方法,你可能只需要使用struct,但我不知道IL是否對它們有不同的處理。

1

繼鮑勃叔叔的凝聚力「規則」應該會發現你居然創造相當數量的嵌套(嵌套和嵌套!)班的。這些可以進行非嵌套但只有,如果你有現在引用它們的其他客戶。

1

我想提高我以前的答案!

其中I使用嵌套類,經常被使能接口注入和控制反轉的特定區域。例如...

public class Worker 
{ 
    private IHelper _helper; 

    public Worker() 
    : this (new DefaultHelper()) 
    { 
    } 
    public Worker(IHelper helper) 
    { 
    this._helper = helper; 
    } 

    private class DefaultHelper : IHelper 
    { 
    } 
} 
相關問題