c#中的内存管理(一)开篇

来源:互联网 发布:高清网络摄像机多少钱 编辑:程序博客网 时间:2024/06/01 09:11
前两天有一哥们来公司面试,有两年的工作经验,我就顺口问了一句“说下对using理解?”。
很简单的一个问题,刚毕业的应届生,只要答对using的用法我就很满意了。已经有过经验的,我更看中的是更深一层次的东西。
结果这哥们名听懂,一脸迷茫!
好吧,我错了,普通话不标准,我又重复了一遍问题。
这回这哥们听懂了,然后很自信的坐在我对面,开始滔滔不绝的给我讲了起来。
“using用来引入命名空间。”
我点头。
“另外一个更重要的作用是对内存的释放!”
“释放内存?”我问?
“是的,C和C++中自己申请的内存需要手动释放,C#由于对指针进行了封装,所以不能手动释放内存,所以微软引入的垃圾的回收机制,我们不需要关注内存是如何释放的,这样可以更专注于逻辑实现。但是有些变量是无法释放的,这时候可以通过using手动释放内存。”
我没有发表意见,继续问“C#中的变量在内存中如何存储?”。
这个问题C#的程序员一般不太关注,但我认为,这有这些搞懂了,才能算入门。
对方一如既往的自信:“C的数据类型有两种,值类型和引用类型,值类型变量存储在内存中的栈区,引用类型存储在内存中的堆区。”。
“String类型存储在哪个地方?”我紧接着问?
他想了想,有点犹豫的说“大概存储在栈区吧。”
好了,以上只是一个小插曲。我想以此引出我想讨论的问题。关于C#在内存方面的一些问题。
先就以上的问题给个评价。
C#中,凡是未托管的数据对象都实现了IDispose这个接口,也就是说,我们可以通过执行对象的dispose方法(或使用using)来释放该对象的连接资源。注意,这里是释放连接资源,而非内存。C#中所有的内存资源都是通过垃圾回收机制自动回收的。
举个例子:
                string filepath = "C:\\text.txt";
                System.IO.FileStream fileStream = new System.IO.FileStream(filepath,FileMode.Open);
这里,我们就需要通过调用fileStream.Dispose()方法来释放该对象与text.txt文件的关联。否则的话,text.txt文件属于线程占用状态,无法进行其他操作。同时,调用dispose后,告诉回收站,fileStream 可以释放了。回收站在下次回收的时候释放fileStream 的占用内存。
另外,特别强调一下,String类型属于引用类型,理所当然,数据是存储在内存中的堆区。但是String在用法上和值类型变量相似,这也让很多人造成误解。所以在这时候,我们就要考虑合适的时候使用StringBuilder这个对象。
0 0
原创粉丝点击