理解值与引用[学习]
来源:互联网 发布:方维拼团源码下载 编辑:程序博客网 时间:2024/06/11 09:46
理解值与引用[学习]
面向对象分析和设计需要区分对象的值语义与引用语义。
我的一块钱和你的一块钱相等,这是值语义;
20岁的我和30岁的我是同一个人,这是引用语义。
值对象包括2大特征:表示和运算。比如:3这个整数在计算机内部用二进制11表示,可以参与+,-,*,/等运算;
引用对象包括3大特征:标识、状态 和 行为。比如:person对象拥有不变的标识,并可通过行为改变状态。
值对象的同一性建立在表示的基础上,而引用对象的同一性建立在标识的基础上。
值对象只能被动地参与运算,引用对象拥有主动的行为。
struct 和 class 是 OOP 语言为分别表达值语义和引用语义所提供的语法机制。
C#中 struct 可以实现接口,可以定义方法;但从语义角度,对于 struct 类型的 DateTime 对象 today,today.AddDays(1) 的语义是today 和 1 参与 AddDays 运算得出一个新的日期值。
由于值对象的同一性建立在表示的基础上,而引用对象的同一性建立在标识的基础上。值对象从语义上是不可变的,而引用对象从语义上是不可拷贝的。但在 实际实现中由于性能考虑常常会用引用语法来实现值语义,比如:C# 的 string 是值语义,但却是引用语法;类似的,flyweight 模式被共享的小对 象也是引用语法表达值语义。由于值语义的不可变性要求,用引用语法模拟值语义常常会加上不可变的限制,比如:C# 的 string 对象在参与 + 运算本身并不 改变,而是产生一个新 string 对象作为结果。这种通过不可变引用语法来模拟值语义的手段在不支持 struct 的 Java 中更加常用。而在 C++ 中,虽 然提供了 struct 和class,但二者在语法上都是值语法(可拷贝);所以,在 C++ 中常常会为 class 加上不可拷贝的限制明确引用语义,强制使用指针或引用的方式使用对象。
在使用上,值对象通常用于表示引用对象的某一属性,比如:颜色RGB,字体类型,出生日期。
下面通过一个例子进一步体会值与引用的区别:
- 理解值与引用[学习]
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 理解C#值类型与引用类型
- 值传递与引用传递理解
- 巧妙理解方法的值参数与引用参数
- [转]理解C#值类型与引用类型
- [转]理解C#值类型与引用类型
- 理解C#值类型与引用类型 <转>
- [转]理解C#值类型与引用类型
- Qt Plugin简单示例
- WinForm 窗体间传递数据的一些方法[转]
- MO_GLOBAL - EBS R12 中 Multi Org 设计的深入研究
- I Believe I Can Fly
- android之Itent.ACTION_PICK Intent.ACTION_GET_CONTENT妙用
- 理解值与引用[学习]
- JAVA数据流的概述
- C# 浅拷贝与深拷贝区别
- Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid
- JSP+Servlet登录页面制作
- 看懂SQL Server 查询计划[转]
- SQL Server 中 RAISERROR 的用法
- 2011-07-27 —— 杂记 —— SetEvent 和 PulseEvent 的区别
- __asm____volatile__GCC的内嵌汇编语法AT&T汇编语言语法