码迷,mamicode.com
首页 > 其他好文 > 详细

值类型和引用类型的区别

时间:2015-05-05 19:01:18      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

.net的类型可以分为两类:值类型和引用类型。

常用的值类型包括结构、枚举、整数型、浮点型、布尔型等,而在C#中所有以class关键字定义的类型都是引用类型。

主要在于以下几个区别

1、赋值时的区别

值类型的变量将直接获得一个真实的数据副本,而对引用类型的赋值仅仅是把对象的引用赋给变量。

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Ref ref1 = new Ref(1);
            Ref ref2 = ref1;
            ref2.I = 2;

            Val val1 = new Val(1);
            Val val2 = val1;
            val2.I = (2);

            Console.WriteLine("ref1----"+ref1);
            Console.WriteLine("ref2----"+ref2);
            Console.WriteLine("val1----"+val1);
            Console.WriteLine("val2----"+val2);
            Console.ReadLine();
        }
        /// <summary>
        /// 引用类型
        /// </summary>
        public class Ref
        {
            private int _int;

            public Ref(int i)
            {
                _int = i;
            }

            public int I
            {
                get { return _int; }
                set { _int = value; }
            }

            public override string ToString()
            {
                return "I的值为:" + _int.ToString();
            }
        }
        /// <summary>
        /// 值类型
        /// </summary>
        public struct Val
        {
            private int _int;

            public Val(int i)
            {
                _int = i;
            }

            public int I
            {
                get { return _int; }
                set { _int = value; }
            }

            public override string ToString()
            {
                return "I的值为:" + _int.ToString();
            }
        }
    }
}

输出结果为:

技术分享

值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。

2、内存分配的区别

引用类型的对象将会在堆上分配内存,而值类型的对象则会在堆栈上分配内存。

3、来自继承机构的区别

 static void Main(string[] args)
        {        
            Ref ref1 = new Ref(1);
            Ref ref2 = new Ref(1);
            Val val1 = new Val(1);
            Val val2 = new Val(1);
            Console.WriteLine(ref1.Equals(ref2));
            Console.WriteLine(val1.Equals(val2));
            Console.ReadLine();
        }

执行结果:

False

True

当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。

值类型和引用类型的区别

标签:

原文地址:http://www.cnblogs.com/bigshi/p/4479388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!