请解释C#属性如何工作?

Var*_*ren 9 c# properties

我已经学习了一段时间的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的方法".

字段是一种机制,因此应该是类的私有实现细节; 它没有描述模型的一部分.属性是语义模型的一部分.每只老虎都有一个生日,所以"生日"应该是老虎班的财产.这是老虎"语义模型"的一部分,因此将其作为财产暴露.作为实现细节,生日可能存储在属性访问的私有字段中.

那有意义吗?简而言之:使用公共属性来描述您正在建模的事物的语义属性; 使用私有字段作为实现机制.

  • “IFeedable”已被弃用,取而代之的是“INomNomNomable”。 (2认同)

Ken*_*n D 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看?使用 property Age,我们保证 Age 的最小设置值为 18。