2012-02-28 53 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; } 

    }