2010-10-19 75 views
4

爲什麼我們這樣做:c#使用SET有什麼意義?

private string StatusText 
{ 
    set { toolStripStatusLabel1.Text = value; } 
} 

,而不是僅僅這一點?

private string StatusText 
{ 
    toolStripStatusLabel1.Text = value; 
} 

我不明白使用set的要點嗎?

+4

第二個是無效的語法。你需要添加一個參數。並且應該將其命名爲SetStatusText。但是一個參數Set方法並不符合C#編碼約定,特別是因爲您可能希望稍後添加一個getter。 – CodesInChaos 2010-10-19 16:51:54

回答

16

這是兩個完全不同的事情。

這是一個method

private string StatusText() 
{ 
    toolStripStatusLabel1.Text = value; 
} 

被稱爲像這樣:

StatusText(); 

(並不會編譯,因爲局部變量value無法找到)。爲了使它工作,你需要把它寫這樣的:

private string StatusText(string value) 
{ 
    toolStripStatusLabel1.Text = value; 
} 

,並調用它像這樣:

StatusText("bla"); 

在另一方面,這是一個property的定義:

private string StatusText 
{ 
    set { toolStripStatusLabel1.Text = value; } 
} 

設定器(因此關鍵字set)被稱爲是這樣的:

StatusText = "bla"; 
+3

+1爲示例。屬性便於API消費,數據綁定,邏輯驗證等 – Perpetualcoder 2010-10-19 17:01:57

+1

+1 - 作爲OP的旁註,它也很方便地知道這是特別的簽名一個只寫屬性。 – 2010-10-19 17:15:15

5

因爲可能還會有一個GET:

get { return toolStripStatusLabel1.Text; } 

屬性是語法糖。編譯時,您將有兩種方法get_[property name]set_[property name]。如果您只有設置的方法,則IL中只有set_[propety name]

+0

沙洛姆!在什麼情況下你會使用get>? – 2010-10-19 16:51:50

+0

@jenny shalom,我用一個例子修改了 – 2010-10-19 16:53:19

+0

@jenny屬性就像字段,但具有更大的靈活性。當你問我什麼時候需要'get'的時候,如果你問我什麼時候需要讀取字段值,答案是一樣的。 – Andrey 2010-10-19 16:54:18

1
private String StatusText 
{ 
    get { ... } 
    set { ... } 
} 

get/set標記區分get和set存取方法。

+0

@lain:我想我不明白get/set – 2010-10-19 16:52:13

+0

@jenny,聽起來像你應該閱讀一些更多的文檔:http://msdn.microsoft.com/en-us/library/x9fsa0sw(VS.80)。 aspx – 2010-10-19 16:53:18

1

後者不會編譯。 set部分顯示它是屬性的setter部分。

另一種方法是隻寫一個方法:

private void SetStatusText(string value) 
{ 
    toolStripStatusLabel1.Text = value; 
} 
1

爲了使您能夠應用更復雜的邏輯,當需要將出現。

+0

沙洛姆!我注意到你開始使用asp.netMVC,我也想學習它,但是有很多麻煩,你能跟我分享一些你有useD的教程嗎?我從來沒有做過任何asp.net,只是c# – 2010-10-19 16:58:10

+0

@jenny,嗨( - :這是我認爲最好的在線教程 - http://nerddinnerbook.s3.amazonaws.com/Part1.htm。我不認爲這就夠了,我認爲你應該(像我一樣)使用一本書。這一個 - http://www.amazon.com/Pro-ASP-NET-Framework-Steven-Sanderson/dp/1430210079很棒,但我我不確定它是否適合你,因爲你沒有ASP.NET的經驗。請記住,ASP.NET MVC只是一個基於ASP的框架。NET,所以我真的建議你從那個開始(ASP.NET)。祝你好運( - : – 2010-10-19 17:26:21

2

首先不會編譯爲value是無效的,除非你有set

private string StatusText 
{ 
    toolStripStatusLabel1.Text = value; 
} 

退房MSDN訪問者here

設置和獲取字段和屬性...

例子:

private string statusText; 
public string StatusText 
{ 
    get { return this.statusText;}   
    set { this.statusText = value; 
     toolStripStatusLabel1.Text = this.statusText; 
    } 
} 
3

在更詳細一點,由於運說,她不明白獲取並設置:

getset關鍵字用於定義一個「屬性」。屬性是一對方法 - 「getter」和「setter」 - 在屬性被其他代碼使用或寫入時在幕後使用。與顯式定義getter和setter方法相比,屬性的優點是您可以像使用「字段」(簡單的公共可見成員變量)一樣使用該屬性。使用屬性而不是字段的優點是,屬性允許您自定義分配或使用變量的行爲。您可以創建「計算字段」,在需要時根據對象中的其他數據進行評估,或者在讀取或寫入值時包括基本驗證或其他業務邏輯。

來定義屬性,你開始通過像你宣佈它會現場,但隨後get和set子塊添加一個代碼塊。然後在get塊中定義其讀取行爲,並在set塊中定義寫入行爲。您可以選擇僅定義一個訪問器(製作「只讀」或「只寫」屬性),或者可以爲一個功能或另一個功能定義更有限的可見性;例如,可以讓getter公開,但setter受保護,所以每個人都可以檢查該屬性的值,但只有該類的其他成員和派生類型可以設置其值。

最常見的屬性實現使用一個「支持字段」,充當存儲用於由屬性露出的值的專用變量。爲了簡化這個實現,.NET 3.0包含了「自動屬性」的概念;如果你沒有定義getter和setter的代碼體,編譯器會使用後臺字段生成一個基本的實現。

+0

非常感謝這麼多美麗的回答。真正爲我澄清的事情 – 2010-10-19 17:26:08