2010-10-19 70 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