您的位置:首页 > 其它

引用类型和值类型的学习笔记

2010-08-12 10:18 225 查看
1.大多数的数据类型都是值类型,值类型是存放在堆栈上的,堆栈是基于先进后出,向下填充即从高内存地址向低内存地址填充,堆栈有非常高的性能,但对于有些类型来说,使用起来还不是很灵活,因为有些类型需要在内存中存放很长时间

2.string属于引用类型(有待考证,说法不一),但是不可以被继承,因为他是抽象类,一般需要new的方法都是引用类型,引用类型需要使用托管堆,托管堆与C++使用的堆是不同的,它在垃圾收集器的控制下工作,与传统的堆相比有很显著的性能优势,引用类型的的存储方式是在堆栈上存放地址,在堆中存放实际的对象,与堆栈不同,堆上的内存是向上分配的,所以自由空间在上面

从上面可以看出,建立引用变量比建立值变量要复杂得多,且不能避免性能的降低,在一个引用变量的值赋予另一个相同类型的变量时,有两个引用内存中同一个对象的变量,删除其中一个引用变量时,只会删除堆栈上的地址,不会删除堆中的对象,只到程序停止或垃圾回收器回收

3.关于string是否是引用类型的一个例子

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication4
{
/*基于string引用类型及类的考量*/
class Program
{
static void Main(string[] args)
{
/*更新字符串的值*/
string st = "原始字符串";
string s = st;
s = "更新字符串";
Console.Write(s + "\r\n");
Console.Write(st+"\r\n");

/*更新类中属性的值*/
pr pt = new pr();
pr t = pt;
t.y = 10;

Console.Write(t.y+"\r\n");
Console.Write(pt.y);
Console.ReadLine();
}
}
/*类*/
class pr
{
public int y = 0;
}
}

输出结果:


我们由这个结果及代码分析可以看出,在两个实例化对象指向同一个堆时,改变其中一个值的话,另一个对象的值也会改变,但string类型中,改变其中一个的值,另一个并不会发生改变,从这点看来string是属于值类型的,这是因为string属于引用类型,但在操作上是属于值类型的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: