关于C#中引用变量和变量传递的简单问题

时间:2011-05-30 15:02:51

标签: c# winforms

我正在创建一个WindowForm应用程序,现在我遇到了一个小问题。我有一个注册表格,会询问用户的用户名,手机号码和密码。注册后,信息将被写入文本文件。一旦用户登录成功,用户将显示登录表单我将从用户实体类创建用户对象并将其传递给我的主表单并显示隐藏登录表单的主表单。在一段时间不活动后,主窗体将被隐藏,登录表格将显示给用户。

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类中?提前感谢您提供的任何帮助。欢呼声。

3 个答案:

答案 0 :(得分:2)

你不能这样做。没有引用字段或引用变量这样的东西。只需要在用户更改时触发事件,或者调用代码轮询以更改表单的用户变量。没有其他办法可以做到。

答案 1 :(得分:1)

使用ref关键字在这里没有区别。如果它是同一个对象,对它的任何更改都会反映在任何地方。

答案 2 :(得分:0)

首先,您的用户对象不是ValueType,因此在此特定情况下不需要ref修饰符。当您使用Pass By Value语义时,您只需要执行此操作,用户定义为struct

其次,我不确定你是以正确的方式处理你的问题。您应该考虑重构代码以使其类似于:

  1. 应用程序从MainForm开始:
  2. Uppon Form Load(这是第一次主窗体即将渲染时发生)创建用户登录并将其显示为对话框(您将希望以单独的方法执行此操作,以便您可以在步骤4中重复使用它) 。在此登录表单上提供选项以注册新用户。
  3. 成功登录后,仅将用户存储在主窗体中并关闭“登录”窗体(不要隐藏它,关闭和处理,只需在需要时创建一个新窗口)。对用户的任何后续编辑都应映射到此变量。
  4. 如果非活动期限到期(通过事件处理程序),请取消当前用户并再次显示用户登录并重做步骤2.
  5. 希望这会有所帮助,你会得到一般的想法。