实例化后,实例变量将重置为默认值

use*_*460 3 c# asp.net class visual-studio-2013

我创建了一个类来保存一些电子邮件数据:

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; }    
}
Run Code Online (Sandbox Code Playgroud)

在我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我加载Home.aspx时的预期是显示:

Info: sender receiver a message
Run Code Online (Sandbox Code Playgroud)

但是,它表明

Info: 
Run Code Online (Sandbox Code Playgroud)

EmailClass当我尝试在页面加载中访问它们时,似乎实例变量已重置为默认值.出于调试目的,我添加了一个MessageBox来显示构造函数中的实例变量值(调用构造函数并在实例化期间设置值).

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

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

Jer*_*gen 5

您正在混合字段自动实现的属性.this.sender是不一样的this.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; }    
}
Run Code Online (Sandbox Code Playgroud)

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

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,它要么是第一种方式,要么是第二种方式.第二种方法仅在验证setter中的值或引发INotifyPropertyChanged事件时有用.