值类型和引用类型

在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

值类型:byte,short,int,long,float,double,decimal,char,bool和struct统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。

引用类型:string和class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用new创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。

值类型的实例通常是在线程栈上分配的(静态分配),但在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Parameters
{

    class Program
    {
        static void Main(string[] args)
        {
            Dowork();
        }

        static void Dowork()
        {
            int i = 0;  // int 是值类型
            Console.WriteLine(i);   // i = 0
            Pass.value(i);          // 值类型使用的是 i 的副本,i不变
            Console.WriteLine(i);   // i = 0

            WrappendInt wi = new WrappendInt(); // 创建类 WrappendInt 的另外一个实例
            Console.WriteLine(wi.Number);   // 0 // 被默认构造器初始化为 0
            Pass.Reference(wi);     // 调用方法,wi 和 param 将引用同一个对象
            Console.WriteLine(wi.Number);   // 42
        }
    }

    class Pass
    {
        public static void value(int param)
        {
            param = 42; // 赋值操作使用的是值类型参数的一个副本,原始参数不受影响
        }

        public static void Reference(WrappendInt param) // 创建类 WrappendInt 的一个实例
        {
            param.Number = 42;  // 此参数是引用类型的参数
        }
    }
    class WrappendInt   // 类是引用类型
    {
        public int Number;
    }
}

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

相同点:引用类型可以实现接口,值类型当中的结构体也可以实现接口;

引用类型和值类型都继承自System.Object类。

(1)范围方面:

C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体)、枚举、可空类型。

C#的引用类型包括:数组,用户定义的类、接口、委托、object、字符串。

(2)内存分配方面:

数组的元素不管是引用类型还是值类型,都存储在托管堆上。

引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管堆上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

(3)适用场合:

值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封的。

引用类型可包含null值,值类型不能(可空类型功能允许将null赋给值类型,如int?a=null);

引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值