回答
當嵌套類僅由外部類使用時,不再需要的一個很好的示例是針對集合的枚舉類。
另一個例子可能是一個枚舉代替類中使用的方法,以澄清調用簽名真假參數...
,而不是
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);
這使參數值在客戶端代碼中清除。
我見過只在一個類中使用特殊用途數據結構或者只在一個類中引發和捕獲某個異常的嵌套類的情況。
這兩個地方我用嵌套類:
嵌套類是通過外部類的專用了,我要完全私人的範圍。
嵌套類專門用於實現在別處定義的接口。例如,實現一個枚舉器就屬於這一類。
我有時使用這個簡單的輔助類,我需要一個函數或兩個父類的內部。
對於一個實際的例子,看到了這個問題在今天上午早些時候問:
Make an object accessible to only one other object in the same assembly?
摘要:您可以嵌套在它裏面的相關數據類的業務對象。
當我有一個輔助類時,我不需要對系統中的任何其他對象可見,就可以嵌套類。這樣可以儘可能地限制可見性,這有助於防止類別的意外使用
如果您確定嵌套類沒有意義,那麼在其他任何地方都可以使用它,您真的只想使用嵌套類。例如,如果您需要創建一個包含關於該對象集合的函數和成員信息的幾種類型的對象的列表(例如方法或屬性),那麼您可以使用嵌套類來完成那。也許你需要創建一個對象類型的所有組合列表,然後標記具有某個屬性的所有組合。對於嵌套類來說,這將是一個很好的例子。
如果你不需要嵌套類的方法,你可能只需要使用struct,但我不知道IL是否對它們有不同的處理。
繼鮑勃叔叔的凝聚力「規則」應該會發現你居然創造相當數量的嵌套(嵌套和嵌套!)班的。這些可以進行非嵌套但只有,如果你有現在引用它們的其他客戶。
我想提高我以前的答案!
其中I使用嵌套類,經常被使能接口注入和控制反轉的特定區域。例如...
public class Worker
{
private IHelper _helper;
public Worker()
: this (new DefaultHelper())
{
}
public Worker(IHelper helper)
{
this._helper = helper;
}
private class DefaultHelper : IHelper
{
}
}
- 1. 什麼時候我們在C#中使用嵌套類?
- 2. 什麼時候在嵌套類中調用構造函數(Java)
- 3. 什麼時候你返回一個類,你什麼時候返回一個HttpResponseMessage?
- 4. 什麼時候在C#中使用類?
- 5. 在C#和C++中使用嵌套類 - 爲什麼和何時?
- 6. 什麼時候應該使用嵌套類的示例?
- 7. 什麼時候應該使用嵌套類?
- 8. 什麼時候你想要在輔助線程上運行NSURLConnection?
- 9. 你什麼時候在C#中使用代表?
- 10. 什麼時候你把Javascript放在body裏,什麼時候在頭,什麼時候用doc.load?
- 11. 什麼時候你想存儲一個proc到一個散列?
- 12. 什麼時候你不想使用@synthesized實例變量?
- 13. 你什麼時候想讓UINavigationBar具有多個UINavigationItems?
- 14. Java:你想要什麼時候自定義序列化過程?
- 15. 什麼時候在C++中破壞vtable?
- 16. 什麼時候在C++中需要'int'?
- 17. 什麼時候在C++中使用「declare」?
- 18. 你可以在PHP中嵌套類嗎?
- 19. 你什麼時候INNER JOIN LEFT JOINed表/
- 20. 你什麼時候重載operator new?
- 21. 你什麼時候會用attr_writer?
- 22. 你什麼時候使用新方法?
- 23. 你什麼時候使用jqGrid no_legacy_api = false?
- 24. 你什麼時候處理GDI +資源?
- 25. Symfony sfFormFilters - 你什麼時候使用它?
- 26. 什麼時候你需要導入PHP?
- 27. 你什麼時候使用getGraphObject和getGraphEdge
- 28. 你什麼時候可以使用uint_least16_t
- 29. 你什麼時候使用std :: unordered_map :: emplace_hint?
- 30. 你什麼時候使用mmap
類似的問題 - http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you – Nate 2009-09-15 15:51:52