2016-07-20 173 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的第二個例子有希望表明的那樣。 –