标签:
.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