浅谈值类型和引用类型

菜鸟D在看书的时候,无意中看见说string是值类型(事后发现是在《大话设计模式》P84第九章第五节),感觉脑袋一懵,string不是引用类型吗,怎么成了值类型?string真的是值类型?不对,string就是引用类型。连这种基础问题都需要想一下,看来改温故知新了。

重新看一下值类型和引用类型这两个基础问题(越是基础的问题越是坑人啊)。

通用类型系统(common type system,CTS)支持两种一般类别的类型:值类型和引用类型。

值类型包括基本数据类型(如整型:int;长整型:long;短整型:short;浮点型:float;字符型:char等)也叫内置值类型(有些是系统内置结构的别称,如long),枚举类型(enum),结构类型(struct,结构也被成为用户自定义的值类型)。常用的值类型有DateTime,int ,float,double,bool,char等。

引用类型包括接口,数组,类三大类。其中类又可以分为基类(object),字符串(string),自定义类(class)三类。如果感觉上述内容比较乱,看图可能会更好一点:(图片出自msdn:http://msdn.microsoft.com/zh-cn/library/2hf02550(v=vs.80).aspx

所有的类型都是继承object基类,值类型继承ValueType  ,而ValueType  也继承object基类。

ValueType  是一个抽象类,其本身是一个类类型(有点拗口),不是值类型而是引用类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。通过反编译我们可以看到ValueType重写后的Equals()方法。

(此处反编译的是string的Equals方法):

从string的Equals()方法不难看出string在相等的判断上不仅有地址的判断,还有值的判断。从方式上比较偏向值类型的判断方式。而且String重载了==和!=两个操作符,使string在使用上更加接近值类型。(注意string是String类型的别名)操作符重载详细参见:http://msdn.microsoft.com/zh-cn/library/ff986396(v=vs.110).aspx

值类型和引用类型的区别:

值类型在初始化的时候,会调用隐式构造函数,赋默认值。默认值表如下:http://msdn.microsoft.com/zh-cn/library/83fhsxwc.aspx

引用类型必须初始化以后才可以调用。

  引用类型是可以派生新类型的,string除外,string是sealed密封的。值类型不能派生新类型。

  结构和引用类型都可以实现接口。

  引用类型可以为空,值类型不可以。某些情况下值类型需要为空,便有了可空值类型,如int?。作为参数时,值类型将自己本身复制一份,将复制的结果传过去,引用类型将自己的引用地址传递过去。当需要将值类型的地址传过去时,通常使用ref和out,这样会修改值类型的本身。如下例:

            int a = 1;
            change(ref a);
            Console.WriteLine(a);
            Console.WriteLine("-----------------------------------");
            int b = 1;
            change(b);
            Console.WriteLine(b);

      private static void change(ref int i)
        {
            i++;
            Console.WriteLine(i);
        }

        private static void change(int i)
        {
            i++;
            Console.WriteLine(i);
        }
            

通常的,我们都认为值类型分配在栈上,而引用类型分配在堆上。但是在细微之处是略有区别的,比如一个复杂结构中有一个自定义类的变量,那么该变量应该分配在堆上还是栈上?这个问题菜鸟D回答不了,也希望有人可以为菜鸟D解惑。

本文只是抛砖之作,更多精深内容在此:http://www.dwww.cn/News/2008-3/2008331712296595.shtml

菜鸟D希望这篇文章对您有所帮助。

时间: 2024-07-31 10:17:00

浅谈值类型和引用类型的相关文章

浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

【.Net】浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

浅谈PHP变量的值类型和引用类型

看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式. PHP的变量在内存中是这样存储的,变量保存的并不直接是值的内容,而是地址.例如: $a = 1; 我们看起来,似乎变量$a直接存储了 1 这个值.而实际情况是,PHP解释器创建了变量$a,将值:1 存入内存中的某个地方,再将值的地址存到变量$a中. 需要取值时,先找到变量$a中的地址,再根据地址找到变量的值. 往下看: echo $a; 会输出1,PHP解释器会这样完成这一样代码:找到$a中存储的地址,根据地址找

C#中值类型和引用类型的区别浅记

C#中值类型和引用类型的区别浅记 在C#中,变量的类型分为两种,分别是值类型和引用类型. 值类型的变量直接存储值,说得更具体一些,就是值类型变量在内存中直接存储它们自身的值,如代码所示, int x = 2: 值类型变量x,在内存中的某处直接存储了它自身的值:2. 引用类型的变量存储的是对其对象的引用,更进一步说,就是引用类型变量在内存中直接存储了一个指向它处的引用,而引用所指的对象则保存在引用类型变量所指的内存中.如代码所示, public class Thing { int x; } Thi

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

数据类型(1) - 值类型和引用类型

和javascript等脚本语言不同,C#基本上可以说是强类型的编程语言.这意味着,任何变量在编译时(而不是运行时)就必须要有一个类型.直到c#4.0,引入了动态类型为止.c#的弱类型体现在其类型object中.任何变量都可以是object类型的,也就是说他们在编译时没有类型,肯定能通过编译.但错误将会在运行时才发生. 强类型的好处有很多,例如可以保证类型安全(否则将会发生运行时错误),可以享受IDE带来的智能提示等,不容易出错(出错可以在编译的时候就知道).c#有很多数据类型,而他们可以分为两

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员

Java值类型和引用类型

[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 by

java 值类型和引用类型的区别

1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字