C#引用类型和值类型在内存中的分配。

分析一下引用类型和值类型在内存中的分配。系统为C#程序在内存中分配了堆栈(stack)和托管堆(heap),堆栈用来存储值类型,而托管堆用来存储引用类型,该托管堆由垃圾收集器(Garbage Collector,GC)进行自动管理。
当创建一个值类型时,系统会直接在堆栈上为该值类型分配空间,而创建一个引用类型时,系统先在堆栈上为该引用分配内存,这个内存表示的是一个内存地址,然后在托管堆上为该引用对象的实例分配内存,将引用地址指向托管堆上分配的内存地址,这种分配方式不会受堆栈大小的限制(线程堆栈的默认大小是1MB),那么在引用传递的时候,其实是将堆栈中引用的地址传递给了另外一个引用,它们都指向托管堆中的同一个对象。引用对象的建立过程比较复杂,因此,性能也有所降低。值类型在其生命周期结束时,系统会自动将其从堆栈中删除,而引用对象会长时间保留在托管堆中,直到该引用对象不被任何一个变量所引用,垃圾收集器会在适当的时候将其回收。当然,用户可以调用 GC类的Collect方法对托管堆内存进行强制回收。

Console的ReadLine方法,用于从控制台中读入一行字符串数据。
实例中使用int类型提供的Parse方法将字符串转换成int类型,如果字符串表示的并不是int型变量,则会引发运行时异常。其实C#提供的整数类型和浮点类型都提供了Parse方法来将字符串转换成对应的类型。

还有一个与Parse方法功能类似的TryParse方法,该方法同样可以将指定类型的字符串转换成该类型,但不同的是,TryParse 在转换成功时返回 true,转换不成功时返回flase,并不会抛出异常导致程序中断。

参数前面的ref 关键字表示该参数为值类型的引用传递。所谓引用传递,即将数值本身传递到函数体内,在函数中对该参数的修改会造成对数值本身的修改。如果函数的参数是引用传递,在调用该函数时,必须在参数前加上ref关键字。
ref 参数必须先初始化。

对于函数参数中值类型的参数,如果不加ref关键字,则为值传递。

参数前面的out关键字表示该参数为引用传递
此处的out关键字与前面的ref关键略有不同,out关键字修饰的参数在传递时是不需要初始化的。

numbers前面加入了params关键字,表示在调用函数时可以直接输入可变数量的参数。例如,实例代码中在调用GetMultResult函数时,并没有传递一个整型数组,而是直接传入三个整数,系统此时会自动将这三个整数作为函数中numbers的三个元素。这样就可以实现参数的动态变化
用params关键字修饰函数参数时,只能存在一个且必须放在最后。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值