2011-05-30 40 views
2

我正在創建一個WindowForm應用程序,現在我有一個小問題。我有一個註冊表格,它會詢問用戶的用戶名,手機號碼和密碼。註冊後,信息將被寫入文本文件。一旦用戶登錄成功,用戶將顯示一個登錄表單,我將從用戶實體類創建一個用戶對象,並將其傳遞到我的主窗體並顯示隱藏登錄窗體的主窗體。經過一段時間不活動後,主窗體將被隱藏,登錄窗體將顯示給用戶。關於引用變量和C#中的變量傳遞的簡單問題

public class User 
{ 
    private string userName; 
    private string mobileNumber; 


    public User(string uName, string mnumber) 
    { 
     userName = uName; 
    mobileNumber = mnumber; 
    } 

    public string MobileNumber 
    { 
     get 
     { 
      return mobileNumber; 
     } 
     set 
     { 
      mobileNumber = value; 
     } 
    } 

    public string UserName 
    { 
     get 
     { 
      return userName; 
     } 
     set 
     { 
      userName = value; 
     } 
    } 

}

public partial class Login : Form 
{ 

    //Other codes 
    //Upon successful login 
    User user = new user(username,mobilenumber); 
    //Hide the Login Form 
    this.Hide(); 
    //Display the main Form 
    MainForm main = new MainForm(ref user, this); 
    main.Show(); 
} 

public partial class MainForm : Form 
{ 
    private User user; 
    private Login login; 

    Public MainForm(ref User user, Login login) 
    { 
      this.user = user; 
      this.login = login; 
    } 
} 

的形式將切換常常登錄 - >的MainForm - >登錄。這是我的問題。 ,當我將用戶對象作爲參考變量傳遞給MainForm時,如上所示,對MainForm類中的用戶對象所做的任何更改都將反映在登錄類中,但MainForm中的用戶對象不會具有最新值,並且它將是mainForm對象首次創建時的值。爲什麼這樣,爲什麼在MainForm中所做的更改會反映在登錄表單中,而不是MainForm類中呢?預先感謝您提供的任何幫助。乾杯。

+0

因爲你只是通過一種方式參考?我不確定這裏的問題是什麼。 – 2011-05-30 15:13:55

+0

代碼更新後,出現了一個小錯誤。實際上,當用戶成功登錄時,我將從文本文件中讀取手機號碼並使用它創建用戶對象,而在Mainform中我有標籤頁,其中一個標籤頁允許用戶編輯他的用戶名和手機號碼更新到相同的文本文件。我將向用戶顯示舊的用戶名和手機號碼,但是我意識到,在那裏完成的任何版本都將反映在登錄類中,但不是MainForm類,因爲MainForm類仍將顯示舊值。我希望我現在更清楚 – tester 2011-05-30 15:22:22

+0

我如何通過參考兩種方式?或者執行此任務的正確方法。我不想每次用戶訪問標籤頁來編輯他/她的信息時從文件中讀取。 – tester 2011-05-30 15:24:49

回答

1

使用ref關鍵字在這裏沒有什麼區別。如果它是同一個對象,它的任何改變都會反映到任何地方。

2

你不能這樣做。沒有參考字段或引用變量這樣的東西。只需要在用戶更改時觸發事件,或者讓代碼輪詢表單的用戶變量中的更改。沒有其他辦法可以做到這一點。

0

首先,你是用戶對象不是ValueType因此ref修飾符在這種情況下不是必需的。只有當您使用Pass By Value語義時,您才需要執行此操作,用戶將其定義爲struct

其次,我不確定你是否正確地處理了你的問題。你應該考慮重構你的代碼工作類似於:

  • Uppon表格負荷(出現這種情況的第一次主要形式是約渲染)創建用戶登錄並顯示爲:

    1. 應用與MainForm的開始一個對話框(你會想用一個獨立的方法來做到這一點,這樣你就可以在第四步中重用它)。在此登錄表單上提供一個選項來註冊一個新用戶。
    2. 成功登錄後,只將用戶存儲在主窗體中並關閉登錄窗體(不要隱藏它,關閉並處置,只需在需要時創建一個新窗體)。對用戶的任何後續編輯都應映射到此變量。
    3. 如果不活動週期期滿(通過事件處理程序),取消當前用戶並重新顯示用戶登錄和重做步驟2

    希望這有助於你得到的總體思路。

  • +1

    實際上'ref'修飾符可以用於值和引用類型。但是他並沒有將參數設置爲構造函數中的任何參數,所以在這裏沒有任何意義。 – Magnus 2011-05-30 15:53:07

    +0

    是的你是對的。我在談論他的特殊例子,儘管如果用戶是一個結構體,他只需要使用'ref',但事實並非如此。我說的方式確實有利於誤解,所以我編輯了它以使其更清晰。感謝您指出。 – InBetween 2011-05-30 16:09:33

    +0

    在第一段中有很多錯誤信息,我甚至不知道從哪裏開始。 – 2011-05-31 13:51:24