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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘冬晓 中级黑马   /  2012-4-8 19:41  /  2068 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我有时候老是不知道什么时候用到他们,对他们的概念有点模糊,请教一下,都什么时候用到它们啊?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

9 个回复

倒序浏览
值类型只是简单的拷贝,被调函数的值不会改变调用函数的值
引用类型的值的改变会传会调用函数
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3

引用类型:
单元放的是另外一个对象的引用(地址)
如:
Form form1=new Form();
就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
Int、 datetime 、bool、 char等类型都属于值类型(ValueType),赋值的时候是传递拷贝。
普通的对象则是引用类型,赋值的时候是传递引用。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的队中,而内存单元中只存放在堆中对象的地址。

2.值类型存取速度快,引用类型存取速度慢。

3.值类型表示实际数据,引用类型表示指向存储在堆中的数据的指针或引用

4.值类型继承自System.ValueType,引用类型继承自System.Object

C#中基本数据类型是值类型,结构也是值类型。而数组、类、接口、字符串都是引用类型。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不同地方。
声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。
引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
从概念上说:
1、值类型:数据存储在内存的栈中,从栈中可以快速地访问这些数据,因此,值类型表示实际的数据。
2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类、接口、数组和字符串)。

二者的区别:
区别:
基本区别在于它们在内存中的存储方式。值类型只将值存放在内存中,这些值类型都存储在栈中。原始数据类型(如bool和int)都属于此类型。而引用类型的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。
下面我用两个例子说明它们的区别:
新建一个控制台应用程序:取名test1
using System;
using System.Collections.Generic;
using System.Text;
namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            int val = 100;
            Console.WriteLine("该变量的初始值为:{0}",val);
            Test(val);
            Console.WriteLine("该变量此时的值为:{0}",val);
            Console.Read();
        }
        static void Test(int getVal)
        {
            int temp = 10;
            getVal = temp * 20;
        }
    }
}
运行结果为:
           该变量的初始值为:100
                 该变量此时的值为:100
为了说明问题,再新建一个控制台应用程序:取名test2
using System;
using System.Collections.Generic;
using System.Text;
namespace test2
{
    class DataTypeTest
    {
        public int val;
    }
    class Program
    {
        static void Main(string[] args)
        {
            DataTypeTest bjTest = new DataTypeTest();
            objTest.val = 100;
            Console.WriteLine("变量的初始值为:{0}",objTest.val);
            Test(objTest);
            Console.WriteLine("变量的值为:{0}",objTest.val);
            Console.Read();
        }
        static void Test(DataTypeTest dataTest)//这里传递的是对象地址
        {
            int temp = 10;
            dataTest.val = temp * 20;
        }
    }
}
命令提示符窗口得出的结果:
变量的初始值为:100
变量的值为:200
  





评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
从概念上说:
1、值类型:数据存储在内存的栈中,从栈中可以快速地访问这些数据,因此,值类型表示实际的数据。
2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类、接口、数组和字符串)。

二者的区别:
区别:
基本区别在于它们在内存中的存储方式。值类型只将值存放在内存中,这些值类型都存储在栈中。原始数据类型(如bool和int)都属于此类型。而引用类型的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。
下面我用两个例子说明它们的区别:
新建一个控制台应用程序:取名test1
using System;
using System.Collections.Generic;
using System.Text;
namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            int val = 100;
            Console.WriteLine("该变量的初始值为:{0}",val);
            Test(val);
            Console.WriteLine("该变量此时的值为:{0}",val);
            Console.Read();
        }
        static void Test(int getVal)
        {
            int temp = 10;
            getVal = temp * 20;
        }
    }
}
运行结果为:
           该变量的初始值为:100
                 该变量此时的值为:100
为了说明问题,再新建一个控制台应用程序:取名test2
using System;
using System.Collections.Generic;
using System.Text;
namespace test2
{
    class DataTypeTest
    {
        public int val;
    }
    class Program
    {
        static void Main(string[] args)
        {
            DataTypeTest bjTest = new DataTypeTest();
            objTest.val = 100;
            Console.WriteLine("变量的初始值为:{0}",objTest.val);
            Test(objTest);
            Console.WriteLine("变量的值为:{0}",objTest.val);
            Console.Read();
        }
        static void Test(DataTypeTest dataTest)//这里传递的是对象地址
        {
            int temp = 10;
            dataTest.val = temp * 20;
        }
    }
}
命令提示符窗口得出的结果:
变量的初始值为:100
变量的值为:200
  





评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
一个具有值类型(value type)的数据存放在栈内的一个变量之中。值类型是轻量级的,它 的数据具有较快的存取速度,因为数据是存储在栈中.
一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于堆中。当访问一 个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用(如果你有使用传统的C 或C++语言编程的经验,那么更贴切的说法应该是指向)堆中的一个实际数据。引用类型的数 据通常比值类型的数据有更大的存储规模和较低的访问速度。
你编写的代码可能经常要将非常大的对象作为参数传递给某个方法。如果这些大的参数作 为值类型而在栈中存储和传递,那么应用程序的性能将会严重降级。引用类型使得你可以在代 码中传递对大对象的一个“引用”,而非大对象本身。值类型则允许你在代码中以优化的方式 直接传递存储在栈中的较小对象

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
说那么多 其实你还是很难去理解。
你只要记住,值类型 本身就是放具体值的。它是存储在stack(栈)中的.(深一点:是一FILO(Frist In Last Out)的形式从内存中销毁)
值与值之间的赋值 是复制。
引用类型是存储在堆栈中,对象存储当前实例的引用,(也就是地址) ,实例才是真实的数据。
引用与引用之间的赋值是传地址。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
pray 高级黑马 2014-4-26 06:23:10
10#
我顶啊。接着顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马