下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、值对象与引用对象起因之前一直写C#,因为有GC,所以不用关心对象的复制问题,默认的浅复制就够了,也就没去深究struct、class、值、引用间的区别,前段时间写了点C+,C+需要手动管理内存,如果类包含有指针或引用成员时就要遵循rule of three,实现复制、赋值复制和析构以正确管理资源,这种生命周期管理函数写多了感觉挺枯燥的,而且我发现许多domain object没有必要实现复制,因为大多数domain object并不适合用值语义来表达,首先它们本质不是一种“值”,并且我希望传递时传递同一个对象,而不是一个副本。C#中同时保留了值类型和引用类型,而我几乎从未写过自定义的值类型。于
2、是我就开始思考值对象和引用对象到底有什么区别,随即写下此文分享本人的见解。值对象(value object)什么是值对象你现在拿出一张纸币,它就是典型的值对象,虽然每张纸币都有一个唯一的编号,但实际使用中这个编号是没有意义的,我们关心的是它们的面值。这里纸币的编号就对应值对象的标识(比如内存地址),纸币的面值就对应值对象表示的值。其它值对象的例子:IP地址、RGB颜色、GUID、地理坐标、日期时间。我的理解:值对象是用来表达一个信息的对象,它的状态是静态的,且比较“透明”;我们使用值对象时,关心的是它所表达的信息,而不是这个对象本身值对象与不可变性(immutability)值对象应该被设计成
3、不可变的(immutable),因为值对象必须要实现为不可变吗?会被“按引用”传递,所以把值对象实现为不可变是最保险的手段。值对象的实现与值对象相关的概念struct与class不管是C+和C#中的struct关键字,还是ruby中的Struct:new都是趋向用于定义简单的复合类型,所以struct适合用来定义没有复杂行为和状态的值对象。而class更趋向用于定义具有丰富逻辑、复杂状态的对象类型,struct、class和值对象、引用对象并不是一一对应的关系,但一般而言,值对象都不会太复杂。字符串抛开具体的实现,字符串是一个静态的字符序列,它的状态决定了它的相等性,是一种值。“引用类型”是具
4、体语言/平台实现中的概念,“值对象”,“引用对象”是语言无关的,引用类型的对象也可能是值对象,只是引用类型的对象不具有原生的值语义。将字符串实现为”引用类型“更多是出于性能考虑。避免复制。传引用,可以避免发生内容的拷贝。可以实现String interning(字符串扣留)。扣留操作会检查一个全局字符串扣留池,看有没有与给定字符串内容相同的已被扣留的字符串对象,如果有则返回,没有则进行扣留。如果程序中有很多内容相同的字符串对象,这样能节约内存,这也是Flyweight模式的一个案例。 java示例:C#示例:很简单,这样用起来更方便。对于C+,可以用const实现不可变性,而Ruby是通过Sy
5、mbol来表示唯一的、不可变的字符串。C#中的值类型C#语言中的类型分为两类“值类型”和“引用类型”,strut和enum属值类型,class属引用类型。C#编译器处理struct时让该类型继承了System.ValueType这个抽象类,而enum则继承值类型 和 引用类型的区别只有一个:一个是值语义(传值,复制),一个是引用语义(传引用),至于什么“一个分配于栈,一个分配于堆”,这是具体实现的问题,而且值类型不一定分配于栈,比如作为引用类型的成员(被捕捉到闭包中同属该情况)。引用对象(reference object)程中,需要传递同一个对象,所以需要传递对象的“引用(即标识、一般是内存地址)”,这也就是“引用语义(reference semantics)”。我们实际写程序中,使用对象的目的在于映射问题域中的事物,基本关心的是对象本身,所以对象大多都属于引用对象。实现在C#和java中用cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒店总经理年终工作计划参考模板
- 小学心理工作计划集锦
- 2025年度班主任工作实习计划范文
- 小学语文第二学期教研计划
- 《食品安全事故总结》课件
- 2025年一周工作计划表格式
- 幼儿园工作计划:个人工作计划
- 《蔬菜陈列培训》课件
- 《复合伤的麻醉》课件
- 《地面工程质量事故》课件
- 2024年PE工程师培训教材-助力工程师成长
- 机动车检测站新换版20241124质量管理手册
- 大部分分校:地域文化形考任务一-国开(CQ)-国开期末复习资料
- 【物理】期末复习练习 质量与密度 2024-2025学年人教版物理八年级上册
- 急性有机磷中毒急救护理
- 2024年人教版六年级科学(上册)期末考卷及答案(各版本)
- GB/T 44143-2024科技人才评价规范
- 广东佛山生育保险待遇申请表
- 药物研发与评价研讨之包装材料和容器变更的技术要求及案例分析
- 化工装置建设流程
- 小班幼儿生活自理情况调查问卷
评论
0/150
提交评论