2011-06-14 47 views
1

MSDN documentation,下面的語法用於:正確的語法爲C#屬性

// A read-write instance property: 
public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

然而,由VS2010自動新庫類生成以下代碼:

public string Name 
{ 
    get 
    { 
     String s = (String)ViewState["Name"]; 
     return ((s == null) ? String.Empty : s); 
    } 

    set 
    { 
     ViewState["Name"] = value; 
    } 
} 

當是適用於在MSDN上顯示的較短示例上使用ViewState語法?

+1

'name'是後臺字段的名稱。 'ViewState [「Name」]'是屬於ASP.NET的'ViewState'字典集合中的一個條目。他們是兩回事。 – BoltClock 2011-06-14 16:50:23

回答

8

ViewState是ASP.Net服務器控件的一項功能,可以持續回傳信息。

對於簡單的特性不在一個服務器控件,你應該使用一個auto-implemented property

public string Name { get; set; } 
+0

在這種特殊情況下,我創建了一個自定義服務器控件 - 一個基於XML文件的自定義菜單。你能更具體地說明在一個屬性中應用ViewState的必要性嗎? – IrishChieftain 2011-06-14 16:52:34

+0

你需要閱讀關於ViewState。如果你不使用ViewState,你的屬性值將不會持續回傳 – SLaks 2011-06-14 16:54:10

+0

謝謝,標記爲答案+1 :) – IrishChieftain 2011-06-14 16:54:51

0

兩者的區別在於,一個是隻是普通的老C#屬性提供訪問(最有可能)私人範圍的變量在你的班級。

另一個返回從ASP.NET的ViewState中恢復的值。

這些是完全兩個不同的東西。

2

第一個將值存儲在類中的私有屬性字段中,而第二個(嘗試)將實際值存儲在ViewState中。

所以第二個只有當你在討論啓用了viewstate的ASP控件時纔可能,這是所有可能情況的一個狹義子集。

1

C#屬性只是一個語法糖。這種結構

public Foo MyValue { get ; private set ; } 

是完全一樣的,如果你編碼:

private Foo _myValue ; 
public Foo 
{ 
    get 
    { 
    return _myValue ; 
    } 
    private set 
    { 
    this._myValue = value ; 
    } 
} 

在這兩種情況下,實際獲取生成的代碼是相當多這樣的:

private Foo _myValue ; 
public Foo MyValue_get() 
{ 
    return this._myValue ; 
} 
private Foo MyValue_set(Foo value) 
{ 
    this._MyValue = value ; 
} 

如果選擇實例你自己的getter/setter,那麼getter/setter體內發生的事完全取決於你。沒有「正確」或錯誤:它取決於程序的需求。

對於ViewState,ViewState是一塊ASP.Net。這種或那種方式對物業幾乎沒有作用。您只是將ViewState項目公開爲公共讀取/寫入屬性。