2016-07-20 131 views
3

之后恢复为默认我创建了一个类来保存一些电子邮件数据:实例变量重置实例

public class EmailClass{ 
    public string sender; 
    public string receiver; 
    public string message; 

    public EmailClass(string sender, string receiver, string message){ 
     this.sender = sender; 
     this.receiver = receiver; 
     this.message = message; 
    } 

    public string Sender { get; set; } 
    public string Receiver { get; set; } 
    public string Message{ get; set; }  
} 

在我的web应用程序,我有一个页面:MyHome.aspx.cs(在相同的命名空间EmailClass创建):

public partial class MyHome: System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     EmailClass obj = new EmailClass("sender", "receiver", "a message"); 
     Response.Write("Info: " + obj.Sender + " " + obj.Receiver + " " + obj.Message); 
    } 
} 

我希望什么时候Home.aspx是加载是显示:

Info: sender receiver a message 

但是,它显示

Info: 

似乎从EmailClass实例变量被重置为默认,当我试图访问这些页面加载。为了调试的目的,我添加了一个MessageBox来在构造函数中显示实例变量的值(构造函数被调用,值在实例化时被设置)。

我的问题:那么是什么导致实例变量的值被重置/不显示?

注意:当我明确设置对象的值时,它在页面加载期间确实显示。 I.e .: obj.Sender = "sender";

回答

5

您在混合字段自动执行的属性this.senderthis.Sender不一样。使用自动实现的属性时,不需要这些字段。这些字段由编译器生成。

这将解决这个问题:

public class EmailClass 
{ 
    public EmailClass(string sender, string receiver, string message) 
    { 
     this.Sender = sender; 
     this.Receiver = receiver; 
     this.Message = message; 
    } 

    public string Sender { get; set; } 
    public string Receiver { get; set; } 
    public string Message{ get; set; }  
} 

如果你希望自己实现的字段,你可以这样做:

public class EmailClass 
{ 
    private string sender; 
    private string receiver; 
    private string message; 

    public EmailClass(string sender, string receiver, string message) 
    { 
     this.sender = sender; 
     this.receiver = receiver; 
     this.message = message; 
    } 

    public string Sender 
    { 
     get { return this.sender; } 
     set { this.sender = value; } 
    } 
    public string Receiver 
    { 
     get { return this.receiver; } 
     set { this.receiver = value; } 
    } 
    public string Message 
    { 
     get { return this.message; } 
     set { this.message = value; } 
    } 
} 

所以,这是无论是第一种方式或第二办法。第二种方法仅在验证setter中的值或引发INotifyPropertyChanged事件时才有用。

+0

啊,我明白了。花了这么多时间试图弄清楚发生了什么。我来自Java背景,希望编译器区分this.xxx和xxx。非常感谢。我将阅读自动实现的属性。时间锁定结束后,将接受您的答案。 – user3437460

+0

你可以从这里开始:https://msdn.microsoft.com/en-us/library/bb384054.aspx快乐编码.... –

+1

@ user3437460 - 这与'this.xxx'和'xxx'无关,正如Jeroen的第二个例子有希望表明的那样。 –