我已经学习了一段时间的C#,而且我在C#书中找到了属性(Head First C#).老实说,我不明白它们的用途,以及我为什么要使用它们.我用Google搜索了几次,但仍然不能为我的生活理解它们.
有人可以向我解释这个外国概念吗?
谢谢,
Varmitharen
Mar*_*ell 19
属性提供对数据的受控访问; 在最基本的情况下,它只是意味着封装一个字段(不推荐使用公共字段),编译器可以为您轻松实现:
public int Foo {get;set;} // the compiler handles the field for you
Run Code Online (Sandbox Code Playgroud)
但是,您可以使用该属性来强制执行逻辑或处理副作用:
private int foo;
public int Foo {
get { return foo; }
set {
if(value < 0) throw new ArgumentOutOfRangeException();
if(value != foo) {
foo = value;
OnFooChanged(); // fire event notification for UI bindings
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他常见选项包括延迟加载,计算成员,代理成员等.
您还可以更改辅助功能,例如:
public int Foo { get; protected set; }
Run Code Online (Sandbox Code Playgroud)
它只能由类型和子类分配,而不能由不相关的代码分配.它也可能只有一个get或set.
基本上,属性充当get/set 方法对的更正式版本,使得更容易讨论"Foo",而不是"get_Foo"/"set_Foo"等(用于双向绑定).
与字段不同,属性也可以在接口上公布,这对于基于接口的代码至关重要
Eri*_*ert 19
虽然其他答案非常好,但它们都非常关注属性的机制.理解属性的哲学也很有帮助.
在面向对象编程中,我们花费了大量时间来构建语义域模型.当你说你有一个"动物"类和派生类"老虎"时,你就是在计算机领域建模一个关于现实世界的事实:世界上所有事物的事实,其中一些是动物,而且是那些动物,其中一些是老虎.
但你必须明白机制和语义是不同的.没有人说"嘿,让我们去动物园看看动物园管理员在老虎的实例上调用IFeedable的方法".
字段是一种机制,因此应该是类的私有实现细节; 它没有描述模型的一部分.属性是语义模型的一部分.每只老虎都有一个生日,所以"生日"应该是老虎班的财产.这是老虎"语义模型"的一部分,因此将其作为财产暴露.作为实现细节,生日可能存储在属性访问的私有字段中.
那有意义吗?简而言之:使用公共属性来描述您正在建模的事物的语义属性; 使用私有字段作为实现机制.
属性用于丰富面向对象编程的封装概念。
即它们封装了一个字段成员,并让您(开发人员)控制如何设置/获取此变量。例子?
public class Person
{
private int m_age;
public int Age
{
set
{
if(value < 18)
m_age = 18;
else
m_age = value;
}
get
{
return m_age;
}
}
}
Run Code Online (Sandbox Code Playgroud)
看?使用 property Age,我们保证 Age 的最小设置值为 18。