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";.
您正在混合字段和自动实现的属性.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事件时有用.