具体来说,任何人都可以给我一个何时或何时不使用嵌套类的具体例子?
我永远都知道这个功能,但从来没有理由使用它。
感谢。
答案 0 :(得分: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);
这使得客户端代码中的参数值清晰。
答案 1 :(得分:11)
我使用嵌套类的两个地方:
嵌套类专门由外部类使用,我想要完全私有范围。
嵌套类专门用于实现其他地方定义的接口。例如,实现枚举器属于此类别。
答案 2 :(得分:4)
当你确定嵌套类没有意义在任何其他地方使用它时,你真的只想使用嵌套类。
例如,如果您需要创建几个类型的对象的列表,这些对象与函数和关于该对象的成员信息短时间关联(如方法或属性),您可以使用嵌套类来执行此操作。也许您需要创建某种类型对象的所有组合的列表,然后标记具有特定属性的所有组合。这对于嵌套类来说是个好例子。
如果你不需要嵌套类的方法,你可以只使用 struct ,但我不知道IL是否以不同的方式处理它们。
答案 3 :(得分:3)
我有时将它用于简单的辅助类,我需要一个函数或父类内部的函数。
答案 4 :(得分:3)
一个实际的例子,请看今天早上提出的这个问题:
Make an object accessible to only one other object in the same assembly?
总结:您可以在其业务对象中嵌套关联的数据类。
答案 5 :(得分:2)
当一个特殊目的数据结构仅在一个类中使用,或者抛出某个异常并且仅在一个类中捕获时,我已经看到了嵌套类的情况。
答案 6 :(得分:1)
当我有一个辅助类时,我会嵌套类,而这个辅助类不需要对系统中的任何其他对象可见。这使可见性尽可能受到限制,这有助于防止无意中使用类
答案 7 :(得分:1)
遵循Bob叔叔关于凝聚力的“规则”应该发现你实际上创建了许多嵌套(和嵌套,嵌套!)类。如果您有其他客户端现在引用它们,则可以非嵌套但仅。
答案 8 :(得分:1)
我想改进我以前的答案!
我定期使用嵌套类的特定区域是启用接口注入和控制反转。实施例...
public class Worker
{
private IHelper _helper;
public Worker()
: this (new DefaultHelper())
{
}
public Worker(IHelper helper)
{
this._helper = helper;
}
private class DefaultHelper : IHelper
{
}
}