类中的类,实例化为单个对象

时间:2012-02-28 21:59:43

标签: c#

我正在尝试使用逻辑分隔符来保持我的所有属性在逻辑上分离,但所以我只需要传递一个对象。我所说的是,我想实例化Object,并能够使用Object.InnerObject.InnerObjectsProperty。这是我正在测试的代码,试图弄清楚如何执行此操作:

   namespace SubclassTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            int x;
            Console.WriteLine("type a number");
            x = Convert.ToInt32(Console.ReadLine());

            OuterClass TestClass = new OuterClass();

            TestClass.OuterNumber = x;
            TestClass.InnerClass.InnerNumber = x;
            Console.WriteLine("success!");
            Console.ReadKey();

        }
    }

    class OuterClass
    {
        public OuterClass()
        {
            _InnerClass InnerClass = new _InnerClass();
        }

        public int OuterNumber { get; set; }

        public class _InnerClass
        {
            public int InnerNumber { get; set; }
        }

        public _InnerClass InnerClass { get; set; }

    }

}

此代码在TestClass.InnerClass.InnerNumber = x上失败; with NullReferenceException - 未将对象引用设置为对象的实例。

构造函数似乎什么都不做,并且它无论是否有效都无法使用。

这甚至可能吗?我想实例化单个OuterClass对象,并让所有包含的对象实例化,并可通过OuterClass对象访问。这样我只需要在方法中传递单个对象,但可以保持内部工作在逻辑上彼此分离。

6 个答案:

答案 0 :(得分:6)

public OuterClass()
{
    _InnerClass InnerClass = new _InnerClass();
}

您正在构造函数中创建一个局部变量InnerClass - 这对您没有帮助 - 您需要该属性:

InnerClass = new _InnerClass();

我对整个方法提出质疑。一般来说,我没有看到嵌套类在这里买到什么,一般来说我会尽量避免使用它们,因为它们增加了复杂性。

答案 1 :(得分:4)

_InnerClass InnerClass = new _InnerClass();

在构造函数中声明一个局部变量;它将在构造函数完成后立即丢弃。如果你这样做

InnerClass = new _InnerClass();

相反,您实际上将在外部类的新实例中设置成员变量。

顺便说一句,我强烈建议您调用内部类InnerClass和变量_innerClass,因为这符合C#命名约定;你当前的命名一定会让大多数人感到困惑。

答案 2 :(得分:1)

您在构造函数中声明了 new 变量_InnerClass InnerClass。删除_InnerClass,它将开始工作: - )

答案 3 :(得分:1)

我认为如果您将OuterClass ctor更改为

   public OuterClass()
   {
       _InnerClass = new _InnerClass();
   }

它会更好用!

答案 4 :(得分:1)

包含InnerClass的构造函数局部变量,然后将其转储。将其更改为:

public OuterClass() 
{ 
    this.InnerClass = new _InnerClass(); 
} 

答案 5 :(得分:1)

您需要创建InnerClass的公共实例

  class OuterClass
    {
        public _InnerClass InnerClass;
        public OuterClass()
        {
            InnerClass = new _InnerClass();
        }

        public int OuterNumber { get; set; }

        public class _InnerClass
        {
            public int InnerNumber { get; set; }
        }

        public _InnerClass InnerClass { get; set; }

    }