2015-01-03 28 views
-4

在我的程序中,我有一個控制器,根據用戶的請求,創建新的窗體和將由這些窗體使用的新對象。簡單地說,這樣的:屬性在設置後不久就變爲空了

ClientForm clientForm = new ClientForm(); 
Client client = new Client(); 
clientForm.SetClient(client); 
clientForm.Show(); 

SetClient做了很明顯的:

Client _client; 

public ClientForm() 
{ 
    InitializeComponent(); 
} 

public void SetClient(Client client) 
{ 
    this._client = client; 
} 

如果我嘗試使用_client而我在SetClient一切是工作正常,但如果我嘗試使用它從一個事件處理程序,我得到一個NullReferenceException,事實上,如果檢查顯示_clientnull,確實很簡單。

這是怎麼發生的?它是否超出範圍或什麼?我怎樣才能防止呢?

+0

當我在測試運行中發現它時(創建表單,發送一個新的客戶端,按下按鈕時調用ToString()),沒有太多的代碼剩下。如果我嘗試在SetClient中調用this.client.ToString(),則沒有問題。 – user3002428

+2

你在哪裏運行第一段代碼?它在main()函數中嗎?或以某種形式......您的事件處理程序在哪裏被處理以及處理程序的代碼是什麼..請提供更多詳細信息 –

+0

我想用額外的代碼進行編輯,當我重新讀取所有我想添加的代碼時,我注意到了新的ClientForm()應該沒有新的。現在我感到很蠢。 – user3002428

回答

2

我發佈了一個答案,所以問題不會沒有一個。

我通常不喜歡在這裏複製粘貼代碼,因爲我不是來這裏要求他人閱讀我的代碼,並找到語法錯​​誤/拼寫錯誤等 - 或者至少我嘗試。

因此,我剝離了所有額外的代碼,並確保使用簡單版本再現錯誤。然後我重新閱讀它,以確保它看起來不錯並且易於閱讀,並且我看到了它。

我在Main中發生了一些事情,因爲這是爲了測試一些想法而編寫的程序。

static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      LauncherForm launcher = new LauncherForm(); 
      Client client = new Client("test"); 

      launcher.SetClient(client); 

      Application.Run(new LauncherForm()); 

     } 
    } 

這裏,它是主演,我的眼睛:Application.Run(new LauncherForm());應該已經Application.Run(launcher);

這可以被觀測到與.GetHashCode解決方案,有人在評論中提出(解決方案,我敢肯定,我」當這樣的事情發生時從現在開始使用,所以謝謝你)。我的簡單方法(請參閱_client是如何在SetClient)缺少這一點。