值类型与引用类型

值类型

byte,short,int,long,float,double,decimal,char,bool,enum和struct 统称为值类型。

值类型的内存地址

  • 值类型的实例通常是在栈上分配的(静态分配)(局部变量参数变量分配在上),但是在某些情形下可以存储在堆中(例如类的成员变量)。
  • 值类型变量声明后,不管是否已经赋值,编译器为其分配内存。

释放内存

函数返回以后,释放内存

示例

	class Person
	{
		private int i = 10; //分配在堆上
							//"当值类型作为引用类型的一个成员的时候,它的值是内嵌在引用类型实例内部在堆上存放的"
		void Test()
		{
			int a = 10;	//局部变量a内存分配在栈上
			// 进入这个函数执行定义变量的语句时为其分配内存
			// 函数返回后,回收释放内存
		}
		void Test1(int a) //与上方的a不是同一个内存。参数变量,分配在栈上。函数返回后,回收释放内存
		{
			Console.WriteLine(a);
		}
		void Test2(Person p) //参数变量,分配在栈上。函数返回后,回收释放内存
		{
			
		}
	}

引用类型

class,delegate,interface,object和string统称为引用类型。

引用类型的内存地址

  • 引用类型的对象总是在进程堆中分配(动态分配)。
  • 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。
  • 当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。

释放内存

没有任何引用变量指向该内存时,通过GC释放内存

示例

	class Animal
	{
		void Test()
		{
			Person person; //引用类型变量,存放的是一个指向对象实例的引用,分配在栈上。
						   //函数返回后,回收释放内存
			person = new Person(); //new出来的Person对象的实例,分配在堆上。
						   		   //当person回收后,没有任何引用指向该实例,通过GC回收该实例
			int a = 10;
		}
	}

	class Person
	{
		private int age;
		string name;
	}

结构体

结构体是值类型,类是引用类型
值传递与引用传递的区别

	class Program
	{
		static void Main(string[] args)
		{
			// Person person1 = new Person();
			// Person person2 = person1;
			// person1.age = 20;
			// person1.name = "sdd";
			// System.Console.WriteLine(person1.age); //20
			// person2.age = 30;
			// System.Console.WriteLine(person1.age); //30

			Animal animal1 = new Animal();
			Animal animal2 = animal1;
			animal1.age = 20;
			animal1.name = "sdas";
			System.Console.WriteLine(animal1.age); //20
			animal2.age = 30;
			System.Console.WriteLine(animal1.age); //20
		}
	}

	class Person
	{
		public int age;
		public string name;
	}

	struct Animal
	{
		public int age;
		public string name;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值