博客
关于我
10.Properties
阅读量:797 次
发布时间:2023-04-04

本文共 1626 字,大约阅读时间需要 5 分钟。

CLR中的属性(Properties)

CLR(常语言运行时)提供了两种类型的属性:

  • 无参数属性(Propertyless properties):称为属性,直接用于数据的封装。
  • 有参数属性(Parameterful properties):在不同编程语言中可能有不同的名称,但它们都用于定义带有参数的属性。

  • 1. 无参数属性(Propertyless properties)

    无参数属性的主要目的是实现数据的封装,避免直接暴露字段,防止代码错误导致对象状态被破坏。这种属性通常用于:

    • 数据封装:确保字段不被公开暴露。
    • 执行某种副作用、缓存值、延迟创建某个内部对象。
    • thread-safe 操作或逻辑字段(如计算值而非直接存储在内存中的值)。

    通过属性,可以定义 getter 和 setter 方法,实现对字段的安全访问。属性可以是只读或可写,通过省略 getter 或 setter 方法来实现。然而,属性的使用会增加编码复杂性,需要编写额外的方法。


    2. 有参数属性(Parameterful properties)

    有参数属性的访问器方法(getter 和 setter)可以接受参数。这些属性通常用于数组或字典的随机访问。例如,C# 中的 Dictionary 类提供了一个带有键的属性,可以通过 [] 运算符访问。

    有参数属性的编译方式与无参数属性类似,编译器会生成相应的 getter 和 setter 方法,并在元数据中记录属性定义。


    3. 自动实现的属性(Automatically Implemented Properties,AIPs)

    C# 提供了简化的语法,允许开发者通过字段直接定义属性,而无需手动编写 getter 和 setter 方法。这种属性被称为自动实现的属性(AIPs)。以下是其特点:

    • 必须是可读和可写的:无法通过 AIP 定义只读或只写的属性。
    • 编译器生成私有字段:字段名由编译器确定,开发者无法直接访问。
    • 必须在构造器中初始化:无法在字段声明时初始化。
    • 可能导致序列化问题:字段名可能随着重新编译而更改,破坏序列化兼容性。
    • 不支持调试断点:无法在 getter 或 setter 方法上设置断点。

    因此,AIPs 适合简单的场景,但在需要更高控制力或可序列化的对象中不推荐使用。


    4. 编译过程

    编译器处理属性的方式:

  • 生成 getter 和 setter 方法:如果定义了相应的访问器。
  • 生成属性定义:在元数据中记录属性的信息。
  • 支持智能字段:属性可以包含逻辑,而不仅仅是字段。
  • C# 提供了对属性的强大支持,开发者可以直接通过属性访问,而无需调用 getter 或 setter 方法。其他语言如果不支持属性,也可以通过调用访问器方法实现相同的功能。


    5. 属性的使用场景

    • 封装字段:将字段暴露为属性。
    • 读写操作:通过属性实现对对象状态的读写。
    • 集合操作:通过索引器实现随机访问或修改集合项。
    • 性能优化:在不影响可读性的情况下,通过属性实现复杂逻辑。

    6. 属性的局限性

    • 理解难度:属性看起来像字段,但实际上是方法,容易导致混淆。
    • 性能差异:在调试模式下,属性访问可能比字段慢。
    • 可扩展性:某些场景下,方法更适合(如 thread-safe 操作或远程访问)。

    7. 属性的最佳实践

    • 提供默认值:如果属性是可写的,确保有默认值或初始化逻辑。
    • 避免过度封装:仅封装真正需要保护的字段。
    • 使用可读性优先:如果属性的行为可以通过方法实现,选择方法以提高可读性。

    8. 属性的性能

    • JIT 编译:属性访问器方法会被内联,提升性能。
    • 调试模式:属性访问在调试模式下会有性能开销,建议在发布模式下使用。

    9. 属性的元数据

    属性的元数据由编译器生成,包含:

    • getter 和 setter 的方法。
    • 属性的类型。
    • 访问器的访问级别。

    通过以上内容,希望对 CLR 中的属性(properties)有了清晰的理解。

    转载地址:http://eirfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    Webpack 基本环境搭建
    查看>>
    mysql5.7 安装版 表不能输入汉字解决方案
    查看>>
    MySQL5.7.18主从复制搭建(一主一从)
    查看>>
    MySQL5.7.19-win64安装启动
    查看>>
    mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
    查看>>
    MySQL5.7.37windows解压版的安装使用
    查看>>