请解释C#属性是如何工作的
本文关键字:工作 何工作 解释 属性 | 更新日期: 2023-09-27 18:00:27
我学习C#已经有一段时间了,我在C#书中发现了一些属性(Head First C#)。老实说,我不明白它们的用途,也不明白我为什么要使用它们。我在谷歌上搜索了几次,但我一辈子都无法理解它们。
有人能给我解释一下这个外国概念吗?
谢谢,
Varmitharen
属性提供控制的数据访问;在最基本的情况下,它可能只是意味着封装一个字段(不建议使用公共字段),编译器可以让它变得简单:
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。
基本上,属性充当方法的get/set对的更正式版本,使谈论"Foo"比谈论"get_Foo"/"set_Foo"等(用于双向绑定)更容易。
与字段不同,属性也可以在接口上发布,这对于基于接口的代码
尽管其他答案都很好,但它们都是关于属性的机制的。理解属性的哲学也很有帮助。
在OO编程中,我们花费大量时间构建语义域的模型。当你说你有一个类"Animal"和一个派生类"Tiger"时,你是在计算机领域模拟一个关于真实世界的事实:世界上所有的东西,其中一些是动物,而这些动物中,一些是老虎。
但您必须理解机制和语义是不同的。没有人说"嘿,让我们去动物园看看动物园管理员在老虎的实例上调用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;
}
}
}
看到了吗?利用属性Age
,我们保证了年龄的最小集值是18。
那么你熟悉字段吗?如果是这样,从使用类的代码的角度来看,属性与字段完全相同。然而,在类内部,属性就像一对方法,一个处理将值返回给使用者,另一个处理更新值。这些方法通常被称为getters
和setters
。
想要使用属性而不是字段的一个很好的理由是,它可以更好地控制传入和传出属性的值。