.net程序员的盲点(二):两个“属性”引起的歧异

本文解析了.NET中的property和attribute的区别,property提供对私有字段的安全访问封装,而attribute作为元数据描述代码特性,如@Conditional、@DllImport等,用于影响程序行为。

来源:优快云 董昊(昊子)的专栏 http://blog.youkuaiyun.com/edisundong/archive/2007/08/05/1727760.aspx

两个“属性”引起的歧异 - property attribute 的区别 
这虽然没有“一个馒头引发的血案”那么严重,但是也足以成为 .net 程序员的技术盲点之二。
对于 property attribute 这两个名词都叫“属性”的问题,来源于国内 it 书籍翻译界的疏忽。
其实它们来源于两个不同的领域, attribute 属于 OOA/OOD 的概念,而 property 属于编程语言中的概念。下面我们来说明它们的异同。
Attribute
Attributes Microsoft .NET Framework 文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
Property
属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在 C# 中以 get set 访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。关于属性的概念,不是本文的重点,而且相信大部分的技术人员应该对属性有清晰的概念。以下是简单的属性
区别
可以说两者没有可比性,只不过我们国家的语言特点才引起的歧异,其实只要记住 Attribute 是派生于 System, Attribute 类之下,它的主要作用是描述,比如某为了描述某个方法是来自与外部的dll
可以写如下代码,这就是一个Attribute,他是一个描述(或者说声明)
[DllImport("User32.dll")]
 
Attribute 也有很多系统的“默认”属性,见下表

预定义的属性
有效目标
说明
AttributeUsage
Class
指定另一个属性类的有效使用方式
CLSCompliant
全部
指出程序元素是否与 CLS 兼容
Conditional
Method
指出如果没有定义相关联的字符串,编译器就可以忽略对这个方法的任何调用
DllImport
Method
指定包含外部方法的实现的 DLL 位置
STAThread
Method(Main)
指出程序的默认线程模型为 STA
MTAThread
Method(Main)
指出程序的默认模型为多线程 (MTA)
Obsolete
除了 Assembly Module Parameter Return
将一个元素标示为不可用,通知用户此元素将被从未来的产品
ParamArray
Parameter
允许单个参数被隐式地当作 params( 数组 ) 参数对待
Serializable
Class Struct enum delegate
指定这种类型的所有公共和私有字段可以被串行化
NonSerialized
Field
应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化
StructLayout
Class struct
指定类或结构的数据布局的性质,比如 Auto Explicit sequential
ThreadStatic
Field( 静态 )
实现线程局部存储 (TLS) 。不能跨多个线程共享给定的静态字段,每个线程拥有这个静态字段的副本

 
 
Property 是指编程过程中的字段,也即类的成员。
如:
private int hour; // 定义私有变量表示 " 小时 ", 外部是访问不到的 .}

public int Hour//
定义 Hour 程序接口

{

set { hour=value; }

get { return hour;}

}

 

### FDTPUT 的基本概念和技术细节 `fdtput` 是 Device Tree 编辑工具链中的一个重要命令,用于向设备树进制文件(`.dtb` 文件)中写入数据。Device Tree 是一种描述硬件的数据结构,在嵌入式 Linux 系统开发中广泛使用。 #### 命令概述 `fdtput` 可以用来修改 `.dtb` 文件的内容,支持多种数据类型的输入操作。其主要功能包括但不限于添加属性、更新节点以及设置数值等[^1]。 以下是 `fdtput` 的典型语法形式: ```bash fdtput [选项] <filename> <nodename> <property> <value> ``` - `<filename>` 表示目标 `.dtb` 文件路径。 - `<nodename>` 定义要编辑的具体节点名称。 - `<property>` 指定需要创建或修改的属性名。 - `<value>` 则表示该属性对应的值。 #### 数据类型处理 通过不同的参数组合可以指定存储到 device tree 中的数据格式: | 参数 | 描述 | |------------|----------------------------------------------------------------------| | `-a` | 将给定字符串作为 ASCII 字符串保存 | | `-u` | 存储无符号整数 (uint32_t),默认行为 | | `-s` | 解析并存入一系列由逗号分隔的小端字节序列 | 例如下面这条指令演示如何往某个特定节点下的子项赋初值为十进制数789的情况: ```bash fdtput -ta mydevicetree.dtb /example-node reg 0x315 ``` 这里我们利用了自动检测模式(`-t`)来推断出最合适的目标类型, 并且设置了地址寄存器关联区域(reg property). #### 实际应用案例分析 假设存在这样一个场景需求: 需要在已有的 DTB 文件里新增加一个外设控制器的相关配置信息. 这时候就可以借助于 fdtput 来完成这项任务. 具体步骤如下所示: 1. 创建一个新的节点 `/my-controller`. 2. 设置兼容性字段(compatible)表明此模块遵循的标准. 3. 添加必要的资源定义比如内存映射基址(base address), IRQ中断编号等等. 对应的实际执行脚本可能看起来像这样: ```bash #!/bin/bash DTS_FILE="path/to/existing-device-tree.dts" TEMP_DTB=$(mktemp).dtb # Compile DTS to DTB first if necessary dtc -I dts -O dtb -o "$TEMP_DTB" "$DTS_FILE" # Add new node and properties using fdtput commands fdtput --create $TEMP_DTB /my-controller compatible "vendor,somecontroller-v1"[^2] fdtput -tu $TEMP_DTB /my-controller reg 0x40000000 0x1000 # Example base addr & size fdtput -ti $TEMP_DTB /my-controller interrupts 42 # Assuming interrupt number is 42 echo "Updated DTB saved as ${TEMP_DTB}" ``` 以上代码片段展示了怎样自动化地构建自定义 hardware description inside an existing binary blob without manually editing the source file directly every time there's a change required. ### 注意事项 当运用这些实用程序时需要注意保持原始备份以防万一发生错误导致不可逆损害; 同时也要确认所使用的版本之间相互匹配以免引起解析上的歧异问题.[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值