我有一个类需要以某种方式封装一些功能。
我正在考虑一个嵌套类,并将该功能和一些状态放入其中。这两个类之间的关系是一对一的。
访问应该声明的外部类成员变量或方法的问题static
,我不想要它。另一种解决方案是将外部类的引用传递给内部类。
我的问题的最佳做法是什么?
我有一个类需要以某种方式封装一些功能。
我正在考虑一个嵌套类,并将该功能和一些状态放入其中。这两个类之间的关系是一对一的。
访问应该声明的外部类成员变量或方法的问题static
,我不想要它。另一种解决方案是将外部类的引用传递给内部类。
我的问题的最佳做法是什么?
虽然我不会说嵌套类是邪恶的,但它们肯定是“恶作剧”,嵌套类可以解决的问题很少,不能以不同的方式或更优雅地解决。
所以这真的取决于你的具体情况,但需要考虑的一些事情是:
嵌套类会公开可见吗?由于消费者必须使用语法来引用嵌套类型,因此这些方法很笨拙:OuterType+InnerType
源文件平均变得更大,并且更难阅读和推理(尽管这可以通过部分类的战略使用来缓解)。
Visual Studio 中的代码分析会大声抱怨公共嵌套类(框架设计指南人员认为它们不是良好的形式),因此如果您使用 FxCop,则需要进行例外处理。
如果您发布更多细节,我们也许可以提供更详细的指导。
大约 6 个月前,我们遇到了完全相同的问题,但原因不同。我们有大约 20 个“常规”类和一个巨大的木星大小的类,它们做得太多了,需要分解。
我们实际上需要两个孩子,除了父母,两个孩子都与父母一对一的关系。
第一次尝试(确实有效)使用了在每个孩子的构造函数中传递“this”引用的老式模式,然后使用 .Parent 方法向上导航。由于 GC 问题,这是一场噩梦,我们在短时间内寻找更好的解决方案。
最好的解决方案(今天仍在使用)是在需要查询父级的子级方法中简单地接受父级类类型的引用。这工作得非常好,GC 喜欢它,并且一切都按预期实例化和释放。代码更易于管理,更有条理,我们现在真的很高兴我们投入了时间来完成它。
所以,这将是我的建议:
Parent
|
+-Child1
|
+-Child2
Child 对象的方法仅在需要它的方法中接受对父类的引用。
它实际上很像 ADO.Net 的开发方式,独立的对象在需要的方法中接受彼此的引用。
using System;
class OuterType
{
private static OuterType _instance;
public OuterType()
{
_instance = this;
}
private String Message
{
get { return "Hello from OuterType"; }
}
public void testInnerType()
{
InnerType innerType = new InnerType();
Console.WriteLine(innerType.FormattedOutertMessage);
}
private class InnerType
{
private readonly OuterType _outerType = _instance;
public String FormattedOutertMessage
{
get { return _outerType.Message.ToUpper(); }
}
// InnerType doesn't need to dispose any object of OuterType.
}
}
然后它像这样工作:
class Program
{
static void Main(string[] args)
{
OuterType outerType = new OuterType();
outerType.testInnerType();
Console.ReadKey();
}
}
但我不确定这是否是个好主意?!