理解值与引用[学习]

来源:互联网 发布:方维拼团源码下载 编辑:程序博客网 时间: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,字体类型,出生日期。

下面通过一个例子进一步体会值与引用的区别:

原创粉丝点击