.net - 为什么我们使用 .NET 属性而不是普通的旧 get/set 函数?

标签 .net oop properties

我了解提供接口(interface)以间接访问类成员的许多好处。我的问题是:这不是你可以用任何 OO 语言使用(类似的东西)完成的事情吗?

public int NormalClass::getQuality() {
    return this->quality;
}


protected void NormalClass::setQuality(int q) {
    this->quality = q;
}

?

除了纯粹的美学之外,.NET 属性还提供了哪些额外的好处?

如果你能提出令人信服的论据,我会接受“可读性”;但就我个人而言,我倾向于认为 get/set 函数比属性更具可读性,因为它无疑是 功能 与直接值(value)相反。

编辑:感谢大家的回答!这对我来说真的很有帮助;总结一下我从已经说过的所有内容中收集/学到的东西,以下是我到目前为止得出的一些结论:
  • 属性(property)的最大好处
    并非来自特定的特征
    属性本身,而是
    从框架和 IDE 功能
    以特殊方式处理属性;
    例如,属性编辑器、XML
    序列化,数据绑定(bind)。
  • 属性可以被视为简单
    以某些方便的方式取值
    get/set 函数不能:在
    特别是 obj.Prop++ 和 obj.Prop =
    值(value)。
  • 属性让你逍遥法外
    使用快速而肮脏的代码
    公众成员无需通过
    实现一堆的头痛
    稍后获取/设置功能;如果你
    应该需要添加一些逻辑
    和/或将公共(public)成员设为私有(private),
    你可以简单地介绍一个属性
    并且不要冒险破坏任何旧代码。

  • 现在,到目前为止,在 2 或 3 个答案中提出了一点,我个人觉得有些可疑:属性意味着廉价的读/写操作,因此可以以与简单变量基本相同的方式使用。我对这一点的问题是,属性中没有任何固有的东西可以真正强制执行这一点。这就是他们的样子假设 要使用的。对我来说,这类似于“shouldBePrivate”限定符,它指示一个值只能由其自己的类直接访问,但无论如何仍可以从外部访问;或者警察在街上巡逻,提醒我们应该守规矩,但在我们开始犯罪时实际上并不干预(如果不强制执行,它真的对我们有什么作用?)。

    如果属性有某种内置机制来确保读/写的廉价性,我会对这一点印象深刻。

    最佳答案

    Jon Skeet 在他的 C# 文章博客上对 why properties matter 有一个很好的概述。 .在其中他解释了为什么应该使用属性而不是暴露公共(public)字段。

    至于为什么要使用属性而不是 getter/setter 方法,我建议以下想法:

  • 属性提供了更清晰、更简洁的语法,易于理解和阅读。
  • 属性启用赋值表达式链接:A.x = B.y = C.z
  • 属性清晰一致地传达了数据访问的语义——消费者期望没有副作用。
  • .NET 中的许多库都可以识别属性,用于诸如 XML 序列化、WPF 绑定(bind)、ASP.NET 2 路绑定(bind)等任务。
  • IDE 和许多可视化设计器都可以识别属性,并且可以在属性编辑器中显示这些属性。
  • 属性启用对递增 (++) 和递减 (--) 运算符的支持。
  • 属性可以很容易地与使用反射的方法区分开来,并允许动态消费者提取有关对象公开的数据的知识。
  • C# 3 支持有助于消除样板代码的自动属性。
  • 关于.net - 为什么我们使用 .NET 属性而不是普通的旧 get/set 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019571/

    相关文章:

    python - 尝试设置对象属性时“str”对象不可调用

    c# - 在C#中实现同步算法

    c# - Moq - 无法遍历隐藏的 IEnumerable

    c# - LINQ to NHibernate 和 let 关键字

    java - 存储对象图形信息的正确方法是什么?

    VB.NET 2012 在属性获取上设置属性

    c# - Convert.FromBase64String(...) 抛出 FormatException

    c++ - 在成员函数中调用成员结构

    java - 如何使用层次结构父类的方法?

    java - 在java中读取属性文件时出现文件未找到错误