C# 我如何查看“文件”中包含的内容;抽象类控制器“;处理方法
我使用Visual Studio 2013创建了一个新的asp.net mvc-5 web应用程序。我使用entity framework 6映射了我的数据库表,它生成了一个C# 我如何查看“文件”中包含的内容;抽象类控制器“;处理方法,c#,asp.net,asp.net-mvc,iis,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Iis,Asp.net Mvc 5,我使用Visual Studio 2013创建了一个新的asp.net mvc-5 web应用程序。我使用entity framework 6映射了我的数据库表,它生成了一个.edmx文件。然后我选择创建一个新的控制器类。我检查了新控制器类的生成代码,发现在控制器类的末尾,我得到了以下用于处理当前http请求的代码:- protected override void Dispose(bool disposing) { if (disposing)
.edmx
文件。然后我选择创建一个新的控制器类。我检查了新控制器类的生成代码,发现在控制器类的末尾,我得到了以下用于处理当前http请求的代码:-
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
现在我知道了关于处理当前http请求的以下事实:-
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
Dispose()
的方法实现为空。那么有没有办法知道控制器基类中Dispose方法的实现呢
Dispose()
方法的默认实现的一部分,还是需要显式调用Dispose方法中的垃圾收集器
谢谢
编辑
以下是dispose方法为空的公共抽象类控制器代码:-
您可以查看并搜索Dispose方法,该方法如下所示:
public void Dispose()
{
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
你应该阅读这篇关于微软的文章,它包括了所有的建议以及做和不做的事情
。那么,有没有办法知道控制器基类中dispose方法的实现
MVCController
类型没有实际的Dispose
实现,但是以虚拟方法的形式为您的代码提供了一个占位符,您可以覆盖该占位符
/// <summary>
/// Releases all resources that are used by the current instance of the <see cref="T:System.Web.Mvc.Controller"/> class.
/// </summary>
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize((object) this);
}
/// <summary>
/// Releases unmanaged resources and optionally releases managed resources.
/// </summary>
/// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
protected virtual void Dispose(bool disposing)
{
}
//
///释放类的当前实例使用的所有资源。
///
公共空间处置()
{
这个。处置(真实);
GC.SuppressFinalize((对象)this);
}
///
///释放非托管资源,也可以选择释放托管资源。
///
///true以释放托管和非托管资源;如果为false,则仅释放非托管资源。
受保护的虚拟void Dispose(bool disposing)
{
}
。。在一些在线教程中,他们在dispose方法中调用以下方法:GC.SuppressFinalize(this)
。因此,我不确定这是否是Dispose()的默认实现的一部分
不,只有在实际直接使用非托管代码/内存时才需要调用此函数,在这种情况下,您应该对类型实现终结器或使用safehandle来确保释放非托管内存。另请参见上的Microsoft文档。对于MVC控制器
类型,已经为您调用了它,因此无需再次添加它
调用
GC.SuppressFinalize
可确保如果某个类型具有终结器并且是一次性的(实现IDisposable),则该类型不会在垃圾回收器中升级到下一代,这会使其停留更长的时间,之后释放该代对象时将调用终结器。它告诉垃圾收集器对象已被清理,终结器不需要运行,因此继续释放/释放与此对象关联的所有内存。同样,如果对象上没有终结器,则不需要这样做,因为GC在运行时不应将对象升级到下一代。那么为什么visual studio中不显示此代码?我是否需要在当前项目中提供此代码?现在,当前System.Web.Mvc.Controller类位于以下位置“C:\Users*****\AppData\Local\Temp\14384$System.Web.Mvc.dll$v4.0.30319$NodeDynamic”中但是它的方法是空的..所以你提供的链接中的控制器类的代码在默认情况下不会出现在任何新的asp.net mvc项目中?你能就此提出建议吗?@lgor你的意思是目前我的控制器基类没有Dispose()方法的任何实现?因此,当前在我的控制器中调用base.Dispose(disposing)是没有意义的?@JohnJohn-它确实有一个实现,然后调用虚拟保护方法Dispose(bool disposing)
,然后可以在代码中实现该方法。我会在我的回答(2秒)中也添加该方法。@lgor所以在这个链接中显示的基本控制器类的代码在任何新项目中都不存在?奇怪吗?我认为这个链接中的代码已经在基本控制器类中了,所以您要处理的任何事情都应该在该虚拟方法的重写中进行。通过检查布尔标志,并仅在该标志为真时执行此操作。如果为false,则终结器正在运行,您的托管引用可能不再有效。@lgor因此,此链接中显示的基本控制器类aspnetwebstack.codeplex.com/SourceControl/latest#src/…的代码不在任何新项目中?奇怪吗?我想这个链接中的代码已经在基本控制器类中了?