A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩俊 中级黑马   /  2012-12-3 10:57  /  1811 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请求指教!值类型和引用类型有什么样的区别?

7 个回复

正序浏览
值类型
这种类型的对象总是直接通过其值使用,不需要对它进行引用。基于值类型的变量直接包含值。并且,所有的C#局部变量都需要初始化后才可以使用,值类型同样如此,初始化代码如下所示。
            int s;                                                                                                                //声明整型变量
            s = new int();                                                                                                //声明整型变量
            s = 3;                                                                                                                //初始化变量
上式等同于如下代码。
            int s;                                                                                                                //声明整型变量
            s = 3;                                                                                                                //初始化变量
所有的值类型均隐式的派生自System.ValueType,并且值类型不能派生出新的类。值的类型不能为null,但是可空类型允许将null值赋给值类型,在上面的代码中,程序通过默认的构造函数给为变量s初始化并赋值。

引用类型
引用类型的变量又称为对象,是可存储对实际数据的引用。常见的引用类型有class、interface、delegate、object和string。多个引用变量可以附加于一个对象,而且某些引用可以不附加于任何对象,如果声明了一个引用类型的变量却不给他赋给任何对象,那么它的默认值就是null。相比之下,值类型的值不能为null。

回复 使用道具 举报
值类型分为:
1.简单类型:表示一个有唯一取值的数据类型,包括整型、浮点型、小数型、布尔型等。
2.枚举型
3.结构型
引用类型分为:
1.类
2.接口
3.委托
4.数组
5.字符串
两者的区别在于值类型变量一经定义系统就会为其分配内存空间并自动初始化,例如声明int i;系统会默认为i赋值0.
而引用型变量必须使用运算符new和构造函数创建,这样才会获得内存空间和被初始化。
回复 使用道具 举报
值参数
        当利用值向方法传递参数时, 编译程序给实参的值做一份拷贝, 并将此拷贝传递给该方法.  被调用的方法不会修改内存中实参的值, 所以使用 值参数时 , 可以保证实际值是安全的, 在调用方法时 ,如果形式化参数的类型是值参数的话,  调用的实参的表达式必须保证是正确的值表达式 .

引用型参数  

        和值参不同的是 , 引用型参数并不开辟新的内存区域.  当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法.  发方法中,引用型参数通常已经初始化.
        在方法中使用引用型参数,会经常可能导致多个变量名指向同一处内存地址.
回复 使用道具 举报
值类型和引用类型

(C#中)



  1、值类型

    1>值类型源于System.ValueType家族,每个值类型的对象都有一个独立的内存域保存自己的值,值类型数据所在的内存区域成为栈(stack)。

      只要在代码中修改它,就会在它的内存区域保存这个值。

    2>栈的特点:代码和数据混合存放,所以如果我们向数据中写入特定的代码,计算机有可能将其识别为执行代码,这就叫溢出攻击

  2、引用类型

    1>引用类型源于System.Object家族,它的存储是对值的引用。两个不同的变量指向同一个内存中的物理地址,引用变量的复制只复制对象的

      引用

    2>引用类型的数据存放在堆内,在堆内没有任何代码,只有占用内存、释放内存和垃圾内存

  3、细分值类型和引用类型

     类别                                                     描述

    ------------------------------------------------------------------------------------

    值类型               基本数据类型          整型:int

                                                                    长整型:long

                                                                    浮点型:float

                                                                    字符型:char

                                                                    布尔型:bool

                                 枚举类型                  枚举:enum

                                  结构类型                  结构:struct

    引用类型              类                              基类:System.Object

                                                                    字符串:string

                                                                    自定义类:class

                                 接口                          接口:interface

                                 数组                          数组:int[],string[]

    ------------------------------------------------------------------------------------

  4、装箱、拆箱

    含义:将值类型转换为引用为类型的过程称为装箱,反之称为拆箱

    实例:

       static void Main(string[] args)

       {

              int i=123;      //object一切类的基础,是类的老祖宗

              object obj=i; //装箱(装箱就是把栈内存的数据转移到堆内存)

              int j=(int)obj //拆箱(拆箱就是把堆内存的数据转移到栈内存)

       }

  5、实例

       class SE

          {

              private int Age;

             public int age{get{return age;}set{age=value;}}

          }

       //结构类

       public struct SEE

          {

             private int age;

             public int Age{get { return age; }set { age = value; } }

          }

    1> 值类型参数传递

        private void button2_Click(object sender, EventArgs e)

        {

            int a = 10;

            JiSuanQi jsq = new JiSuanQi();

            jsq.Add1(a);

            MessageBox.Show(a.ToString());

        }

       //JiSuanQi里

       public void Add1(int pamAAA)

        {

            pamAAA = pamAAA + 15;

        }

    2> 引用类型参数传递

       private void button3_Click(object sender, EventArgs e)

        {

            SE se = new SE();

            se.age = 10;

            JiSuanQi jsq = new JiSuanQi();

            jsq.Add2(se);

            MessageBox.Show(se.age.ToString());

        }

       //JiSuanQi里

       public void Add2(SE se)

        {

            se.age += 15;

        }

    3> 结构类型参数传递

       private void button4_Click(object sender, EventArgs e)

        {

            SEE se = new SEE();

            se.Age = 10;

            JiSuanQi jsq = new JiSuanQi();

            jsq.Add3(se);

            MessageBox.Show(se.Age.ToString());

        }

       //JiSuanQi里

       public void Add3(SEE see)

        {

            see.Age += 15;

        }

    4> 值类型的引用参数传递

       private void button5_Click(object sender, EventArgs e)

        {

            int a = 10;

            JiSuanQi jsq = new JiSuanQi();

            jsq.Add4(ref a);

            MessageBox.Show(a.ToString());

        }

       //JiSuanQi里

       public void Add4(ref int pamAAA)

        {

            pamAAA = pamAAA + 15;

        }

    5> 指针概念:使用&加值类型变量可以查看该变量的内存地址,使用*加引用类型变量可以取得该内存地址

  6、结构

     1> 结构的定义:

       访问修饰符 struct 结构名

       {

              //结构体

       }

     2> 结构的特点

       1>结构中可以有字段,也可以有方法

       2>定义时,结构中的额字段不能被赋初值

     3> 结构的使用

       1>可以不用new,直接定义结构的对象即可

       2>声明结构的对象后,必须给结构的成员赋初值

     4> 结构与类的语法高度相似,实际上结构比类要长久30岁,结构是一个复合数据类型,它是由若干字段和属性组合

       的,它是一个值类型

       复合数据类型:类、结构、数组、集合

     5> 实例:

       public struct SEE

          {

             private int age;

             public int Age{get { return age; }set { age = value; } }

          }


回复 使用道具 举报
顶一个!
回复 使用道具 举报
值类型: 单元直接存放“有效值” 如: int a=3; 则a内存单元就放的是3 引用类型: 单元放的是另外一个对象的引用(地址) 如: Form form1=new Form(); 就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身.
回复 使用道具 举报
值类型和引用类型的区别,就在于当函数参数传递的时候,值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的 ,而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马