C#面试题之C# 内部存款和储蓄器管理与垃圾回收

面试题之C# 内部存款和储蓄器管理与垃圾回收

你说说C# 的内部存储器管理是如何的

那句话作者记了一个多礼拜了, 自从上次西北京师范高校面试之后,
具体请看<无论是扯扯东南师范大学的面试>.
国庆闲着没事, 就大致通晓了一下, 其实大二学习C# 的时候接触过,
只然则那会看的也看的懵懂, 小编看的是vir in C#, 顺便查了些资料, 讲真,
看的讨厌。今后过了这么久了, 学了这么久了, 再回来看望实际也不难,
当然深远去询问就gg了, 笔者还记得我的答疑是:C# 有个GC能够协调回收,
在累加引用计数。没错, 小编回复的便是如此笼统, 今后揣摩依旧紧张了,
自己后面接触过, 其实都有印象, 下次面试不要急, 逐步回看。

.NET 中的能源分为两类: 托管财富和非托管财富, 既然有两类资源,
那么自然就有三种回收措施。托管财富由CLLacrosse管理的留存于托管堆上的号称托管财富,
它是由CLHaval管理, 存在于托管堆上,
CL讴歌ZDX会在适用的时候调用GC举行回收。非托管能源:
例如数据库连接, 文件句柄, socket等不由CL汉兰达管理的能源, GC只回收托管财富,
不回收非托管能源。那么如曾几何时候GC会回收内部存款和储蓄器?当1个指标的引用计数为0的时候,
CL揽胜调用GC回收内部存款和储蓄器。而相对于非托管能源来讲, 由于不受CLLAND的管住,
由此大家要求手动回收内存, 调用Dispose方法是个不错的选取,
不过你需求持续自IDisposable接口的类, 看看这几个接口的落到实处:

[ComVisible(true), __DynamicallyInvokable]
public interface IDisposable
{
// Methods
[__DynamicallyInvokable]
void Dispose();
}

还有个Finalize 笔者未曾去询问, 大约看了下, 等会作者会付给链接,
你能够本身看看。我们在写数据库连接语句的时候, 常常会使用的一种写法:

using(SqlConnection = new SqlConnection(...))
{
////ADO.NET语句
}

那是相比较正式的写法, 大三的时候学ado.net, 记得查资料说,
那足以确定保障数据库财富的不利释放, 当时从未多想, 前几日查资料说,
using(){}其实正是调用dispose销毁对象,
而且唯有继承了idispose接口的种类才能销毁对象,
而且是try…catch…finally的简化。既然如此,
我们来看望SqlConnection类是否落实了此接口:

[DefaultEvent("InfoMessage")]
public sealed class SqlConnection : DbConnection, ICloneable
{
// Fields
}

看看DbConnection类:

public abstract class DbConnection : Component, IDbConnection, IDisposable
{
// Fields
}

果真, 还真是那样, 就是说一旦出了using语句的操纵范围,
将会自动调用dispose方法销毁对象能源.听新闻说close方法也是调用了dispose(),看看源码:

public void Close()
{
this.Dispose(true);
}

好吧, 还真是, 假若我们手动调用ado.net的close,
那也是足以关闭数据库连接与数据库能源的。

plus:python的内部存款和储蓄器管理也是由此引用计数来决定的
一点一滴积累, 作者还不信笔者化解不了多个破面试

C#技术漫谈之废物回收机制(GC)(转)

面试之C#–垃圾回收器何时回收?

浅谈C#垃圾回收

相关文章