2011-05-30 66 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