C#中值类型与引用类型的区别

值类型是直接存储一个数值,而引用类型是存储对值的引用,这两种类型分别存储在不用的内存区域。而从内存上看,值类型是在栈中的操作,而引用类型是在堆中的操作。值类型是具体的那个数值所占用的空间大小,而引用类型是存放那个数值的空间地址。
我们知道,在C#中,结构体是值类型,类是引用类型。值类型可以减少对堆的管理、使用,减少垃圾回收,表现出更好的性能。但是值类型也有不好的一面,比如会涉及到装箱拆箱等操作。而C#中的委托(Delegate)是一种引用类型,该引用类型与其它引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。

通过代码说明如下:

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

namespace Stock
{
    class Program
    {
        static void Main(string[] args)
        {
            Refer.show();    //静态方法不需要实例化
        }
    }
    public class stamp  //定义一个stamp类
    {
        public string Name { get; set; }   //作为引用类型
        public int age { get; set; }   //作为值类型
    }
    public static class Refer   //定义静态类
    {
        public static void show()   //定义静态方法
        {
            stamp stamp1 = new stamp { Name = "xiaoming", age = 22 };
            stamp stamp2 = new stamp { Name = "xiaoqing", age = 23 };
            int age = stamp1.age;
            stamp1.age = 34;
            stamp stamp3 = stamp2;  //引用类型
            stamp2.Name = "xaiohuang";
            Console.WriteLine("stamp1's age : {0}", stamp1.age);
            Console.WriteLine("Current age : {0}", age);
            Console.WriteLine("stamp2's Name : {0}", stamp2.Name);
            Console.WriteLine("stamp3's Name : {0}", stamp3.Name);
            Console.ReadLine();
        }
    }
}

运行结果如下:

运行结果分析:可以看到,当改变Stamp1.age的值时,变量age的值没跟着改变。而在改变了stamp2.Name的值的时候,stamp2.Name的值跟着改变了。这是因为引用类型只是包含堆上面数据区域中地址的引用,他们都指向了同一块内存区域。所以当stamp3引用stamp2时(stamp stamp3 = stamp2;),stamp2改变的值是能够影响stamp3的。当然,改变stamp3的值也能够影响到stamp2。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值