嵌套类型或一对一映射类的其他解决方案

时间:2011-01-06 03:37:25

标签: c# class nested one-to-one

我有一个类需要以某种方式封装某些功能。

我在想一个嵌套类,并将该功能加上一些状态。 这两个类之间的关系是一对一的。

访问外部类成员变量或方法的问题应该声明它们static,我不想要它。另一种解决方案是将外部类的引用传递给内部类。

我的问题的最佳做法是什么?

3 个答案:

答案 0 :(得分:1)

虽然我不会说嵌套类是邪恶的,但它们当然可能是“恶作剧”,并且嵌套类将解决的问题很少,无法以不同方式或更优雅地解决

所以这取决于你的具体情况,但有些事情需要考虑:

  1. 嵌套类是否公开可见?由于消费者必须使用语法来引用嵌套类型,因此这些方法很难实现:OuterType + InnerType

  2. 源文件平均变大,难以阅读和推理(虽然可以通过部分类的策略性使用来减轻这种情况)。

  3. Visual Studio中的代码分析会大声抱怨公共嵌套类(框架设计指南人员认为它们不是很好的形式),所以如果你使用FxCop,你需要做出例外。< / p>

  4. 如果您发布更多细节,我们可能会提供更详细的指导。

答案 1 :(得分:1)

我们在6个月前就遇到过完全相同的问题,但出于不同的原因。我们有大约20个“普通”课程和一个巨大的木星大小的课程,这种课程方式,方式,方式太多,需要分解。

除了父母之外,我们实际上还需要两个孩子,两个孩子与父母一对一的关系。

第一次尝试(确实有效)使用了旧学校模式,在每个孩子的构造函数中传递'this'的引用,然后使用.Parent方法导航回来。由于GC问题,这是一场噩梦,我们在短时间内寻找更好的解决方案。

最好的解决方案(今天仍在使用)是简单地接受父类的类型的引用,这些类是需要查询父级的子方法。这非常好用,GC喜欢它,并且一切都按预期实例化和释放。代码更易于管理,组织更有条理,现在我们很高兴我们能及时投入。

所以,这是我的建议:

Parent
 |
 +-Child1
 |
 +-Child2

使用Child对象的方法仅在需要它的方法中接受对父类的引用。

它实际上与开发ADO.Net的方式非常相似,独立的对象在需要的方法中接受彼此的引用。

答案 2 :(得分:0)

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();
    }
}

但我不确定这是不是一个好主意?!