我已经学习了一段时间的C#,我在C#书中遇到了属性(Head First C#)。老实说,我不明白它们的用途,以及我为什么要使用它们。我用Google搜索了几次,但仍然不能为我的生活理解它们。
有人可以向我解释这个外国概念吗?
谢谢,
Varmitharen
答案 0 :(得分:18)
属性提供受控数据访问;在最基本的情况下,它只是意味着封装一个字段(不推荐公共字段),编译器可以让你轻松实现:
public int Foo {get;set;} // the compiler handles the field for you
但是,您可以使用该属性来强制执行逻辑或处理副作用:
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
}
}
}
其他常见选项包括延迟加载,计算成员,代理成员等。
您还可以更改辅助功能,例如:
public int Foo { get; protected set; }
只能由类型和子类分配,而不能由不相关的代码分配。它也可以只有获取或设置。
基本上,属性作为get / set对方法的更正式版本,使得更容易谈论“Foo”,而不是“get_Foo”/“set_Foo”等(用于双向绑定)。
与字段不同,属性也可以在接口上公布,这对基于接口的代码至关重要
答案 1 :(得分:18)
虽然其他答案非常好,但它们都非常关注属性的机制。了解属性的哲学也很有帮助。
在面向对象编程中,我们花了很多时间构建语义域的模型。当你说你有一个“动物”类和派生类“老虎”时,你就是在计算机领域建模一个关于现实世界的事实:世界上所有事物的事实,其中一些是动物,那些动物,其中一些是老虎。
但您必须了解机制和语义是不同的。没有人说“嘿,让我们去动物园观看动物园管理员在老虎实体上调用IFeedable方法的实例”。
字段是机制,因此应该是类的私有实现细节;它没有描述模型的一部分。属性是语义模型的一部分。每只老虎都有一个生日,所以“生日”应该是老虎班的财产。这是老虎“语义模型”的一部分,因此将其作为财产暴露。作为实现细节,生日可能存储在属性访问的私有字段中。
这有意义吗?简而言之:使用公共属性来描述您正在建模的事物的语义属性;使用私有字段作为实现机制。
答案 2 :(得分:4)
属性用于丰富面向对象编程的封装概念。
即。它们封装了一个字段成员,让你(开发人员)控制如何设置/获取这个变量。实施例
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;
}
}
}
请参阅?使用属性Age
,我们保证年龄的最小设定值为18。
答案 3 :(得分:1)
你熟悉领域吗?如果是这样,从使用您的类的代码的角度来看,属性就像字段一样。但是在你的类中,属性就像一对方法,一个处理将值返回给消费者的方法,一个处理更新值的方法。这些方法通常称为getters
和setters
。
想要使用属性而不是字段的一个很好的理由是它可以让您更好地控制传入和传出属性的值。