2012-02-28 57 views
2

我试图让逻辑分隔符保持我的所有属性在逻辑上是分开的,但所以我只需要传递单个对象。我说的是,我想实例化对象,并能够使用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;带有NullReferenceException - 对象引用未设置为对象的实例。

该构造函数看起来并没有做什么,它无法使用和不使用。

这甚至可能吗?我想实例化单个OuterClass对象,并让所有包含的对象实例化,并可通过OuterClass对象访问。这样我只需要向方法传入一个对象,但可以保持内部逻辑上相互独立的工作。

回答

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

你在你的构造函数创建一个局部变量InnerClass - 那也不会帮助你 - 你需要的属性:

InnerClass = new _InnerClass(); 

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

+0

+1注意到不必要的内部类--OP可能没有意识到,您不需要将该类定义为内部类来获得该类型的成员变量。 – 2012-02-28 22:15:14

+0

是的,我意识到嵌套类不是一个好习惯,但在我正在开发的实际应用中,它们似乎很有意义。它为IT售票系统增加了一项功能。外部类包含有关票据请求的所有信息,而内部类包含有关相关用户的信息(用户名,电子邮件,电话等)。我将所有独特的信息保留在外部类中,而不是将30个成员塞进外部类,并使用多个内部用户对象。然后,我可以将单个对象传递给我的方法,并返回单个对象。 – friggle 2012-02-29 13:21:47

+0

为什么不把相关的类实例公开为外部类的属性呢?无需使用内部类来实现相同的使用组合。 – BrokenGlass 2012-02-29 13:24:25

4
_InnerClass InnerClass = new _InnerClass(); 

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

InnerClass = new _InnerClass(); 

相反,你会实际设置成员变量在外部类的新实例。顺便说一句,我强烈建议你叫内部类InnerClass和变量_innerClass,因为这符合C#命名约定;你目前的命名势必会混淆大部分人。

+0

太谢谢你了!这是我第一次发布到StackOverflow,并且您的人员超越了实用! – friggle 2012-02-29 13:15:32

+0

@friggle:很高兴听到它;这就是这个网站的用途。有礼貌的问题清楚地表明问题出在哪里,而你自己试着解决问题通常会得到答案。:-) – 2012-02-29 14:40:17

1

您在构造函数中声明了新的变量_InnerClass InnerClass。删除_InnerClass它将启动:-)

1

我认为,如果你改变YOUT OuterClass男星到

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

它会运行得更好的工作!

1

您的构造函数局部变量持有InnerClass,然后转储它。将其更改为:

public OuterClass() 
{ 
    this.InnerClass = new _InnerClass(); 
} 
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; } 

    }