2016-07-20 3 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; }  
} 

В моем веб-приложение, у меня есть страница: 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 для отображения значений переменных экземпляра в конструкторе (был вызван конструктор и значения были установлены во время создания экземпляра).

My quesiton: Итак, что вызывает сброс/отсутствие значений переменных экземпляра?

Примечание: Когда я явно устанавливаю значения объекта, он отображался во время загрузки страницы. I.e .: obj.Sender = "sender";.

ответ

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; }  
} 

Если вы хотите реализовать Полях себя, вы можете сделать это:

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; } 
    } 
} 

Таким образом, это либо первый путь или второй путь. Второй способ полезен только при проверке значения в сеттере или повышении события INotifyPropertyChanged.

+0

Ах, я вижу. Проводили так много времени, пытаясь выяснить, что произошло. Я пришел из фона Java и ожидаю, что компилятор будет различать this.xxx и xxx. Большое спасибо. Я прочитаю об автоматических свойствах. Примите ваш ответ, когда тайм-аут закончен. – user3437460

+0

Вы можете начать здесь: https://msdn.microsoft.com/en-us/library/bb384054.aspx Счастливое кодирование .... –

+1

@ user3437460 - это не связано с 'this.xxx' vs' xxx', как я надеюсь, следующий пример Джероена. –

Смежные вопросы