这篇文章主要介绍c#中值类型与引用类型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
,,,,,,,,,,,,,,,,,,,,,,,,,,,,这篇文章主要为大家详细介绍了c#中值类型和引用类型的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在c#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为。如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常。很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识。
首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。从而这两种类型存储在内存的不同地方。
其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元。
栈在编译的时候就分配好内存空间,在代码中有栈的明确定义,而堆是程序运行中动态分配的内存空间,可以根据程序的运行情况动态地分配内存的大小,因此,值类型总是在内存中占用一个预定义的字节数。而引用类型的变量则在栈中分配一个内存空间,这个内存空间包含的是对另一个内存位置的引用,这个位置是托管堆中的一个地址,即存放此变量实际值的地方。
也就是说值类型相当于现金,要用就直接用,而引类型相当于存折,要用得先去银行取。
但值类型在栈上分配内存,而引用类型在托管堆上分配内存,只是一种笼统的说法。下面对其进行详细描述。
(1)对于值类型的实例,如果作为方法中的局部变量,则被创建在线程栈上,如果该实例作为类型的成员,则作为类型成员的一部分,连同其他类型字段存放在托管堆上。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。例如:
int 小姐:=,new int ();
等价于:
Int32 小姐:=,new Int32 ();
等价于:
int 小姐:=,0;
等价于:
Int32 小姐:=,0;
使用新运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。在上例中,默认构造函数将0值赋给了我。
说明:c#的所有值类型均隐式派生自System.ValueType,而System.ValueType直接派生于System.Object。即系统。ValueType本身是一个类类型,而不是值类型。其关键在于ValueType重写了等于方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。
(2)引用类型的实例创建在托管堆上。
下面以一段代码来详细讲解一下值类型与引用类型的区别
namespace Test ,{大敌; ,,,,,class Program ,,,,,{, ,,,,,,,static void Main (string [], args), ,,,,,,,{, ,,,,,,//调用ReferenceAndValue类中演示的方法, ,,,,,,,,,ReferenceAndValue.Demonstration (),, ,,,,,,,,,Console.ReadLine (),, ,,,,,,,}, ,,,,,}, ,,,,,public class stamp ,,,,,,//定义一个类, ,,,,,{, ,,,,,,,public string Name {组,得到,,,},,,,//定义引用类型, ,,,,,,,public int Age {组,得到,,,},,,,//定义值类型, ,,,,,}, ,,,,,public static class ReferenceAndValue ,,//定义一个静态类, ,,,,,{, ,,,,,,,public static void 示范(),,,//定义一个静态方法, ,,,,,,,{, ,,,,,,,,,stamp Stamp_1 =, new stamp {=, Name “Premiere",, Age =, 25,},,//实例化, ,,,,,,,,,stamp Stamp_2 =, new stamp {=, Name “Again",, Age =, 47岁,},,//实例化, ,,,,,,,,,int age =, Stamp_1.Age;,,,,,//获取值类型年龄的值, ,,,,,,,,,Stamp_1.Age =, 22,,,,,,//修改值类型的值, ,,,,,,,,,stamp guru =, Stamp_2;,,,,,//获取Stamp_2中的值, ,,,,,,,,,Stamp_2.Name =,“Again Amend",,,,//修改引用的名称值, ,,,,,,,,,Console.WriteLine (“Stamp_1& # 39; s 年龄:{0},,,Stamp_1.Age);,//显示Stamp_1中的年龄值, ,,,,,,,,,Console.WriteLine(“时代# 39;s 价值:{0},,,年龄),,//显示年龄值, ,,,,,,,,,Console.WriteLine (“Stamp_2& # 39; s 名称:{0},,,Stamp_2.Name);,//显示Stamp_2中值的名称, ,,,,,,,,,Console.WriteLine(“大师# 39;s 名称:{0},,,guru.Name);,//显示大师中值的名称, ,,,,,,,}, ,,,}, 以前,,}c#中值类型与引用类型的示例分析