请解释C#属性是如何工作的

本文关键字:工作 何工作 解释 属性 | 更新日期: 2023-09-27 18:00:27

我学习C#已经有一段时间了,我在C#书中发现了一些属性(Head First C#)。老实说,我不明白它们的用途,也不明白我为什么要使用它们。我在谷歌上搜索了几次,但我一辈子都无法理解它们。

有人能给我解释一下这个外国概念吗?

谢谢,

Varmitharen

请解释C#属性是如何工作的

属性提供控制的数据访问;在最基本的情况下,它可能只是意味着封装一个字段(不建议使用公共字段),编译器可以让它变得简单:

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。

那么你熟悉字段吗?如果是这样,从使用类的代码的角度来看,属性与字段完全相同。然而,在类内部,属性就像一对方法,一个处理将值返回给使用者,另一个处理更新值。这些方法通常被称为getterssetters

想要使用属性而不是字段的一个很好的理由是,它可以更好地控制传入和传出属性的值。