C# 什么';Response.Close()和Response.Dispose()的区别是什么?

C# 什么';Response.Close()和Response.Dispose()的区别是什么?,c#,response,dispose,C#,Response,Dispose,从资源清理的角度来看,为什么会有Response.Close()和Response.Dispose()以及哪一个更全面(调用另一个)?如果提供了这两种方法,Dispose的实现应该调用Close。最好使用using语句确保调用Dispose,从而调用Close,即使存在异常 换言之,请这样做: using (Response response = ...) { // ... } 不是这个: Response response = ...; // ... response.Close()

从资源清理的角度来看,为什么会有
Response.Close()
Response.Dispose()
以及哪一个更全面(调用另一个)?

如果提供了这两种方法,
Dispose
的实现应该调用
Close
。最好使用using语句确保调用
Dispose
,从而调用
Close
,即使存在异常

换言之,请这样做:

using (Response response = ...)
{
    // ...
}
不是这个:

Response response = ...;
// ...
response.Close(); // If there is an exception this might never get called!
关闭和处理对象之间的一个区别是,当您处理对象时,通常无法再使用该对象(尝试这样做可能会导致抛出ObjectDisposedException),但在调用Close之后,仍然可以使用该对象

请注意,如果您谈论的是ASP.NET,则通常不应在响应对象上调用Close或Dispose

Response.Close()
关闭与客户端的套接字连接。
Response.Dispose()
是实现IDisposable接口并释放已分配资源的方法

我认为
Response.Close()
是从
Response.Dispose()
方法调用的


有关更多详细信息,请使用上的《开发类库的设计指南》

有时会使用特定于域的名称 比处置更合适。对于 例如,可能需要进行文件封装 要使用方法名Close。在里面 这种情况,实行私下处理 并创建一个公共关闭方法 电话处理。下面的代码 示例说明了这种模式。你 可以用方法名替换Close 适合您的域。这 示例需要系统名称空间


通常,每当可以打开或重新打开资源时,我都会看到close,因为它为方法名提供了很好的对称性。

另一个区别是
close
应该在
Dispose
不应该抛出异常的情况下抛出异常。例如,正确使用事务操作可能需要显式提交或回滚每个操作。不这样做而调用
Close
会引发异常,但调用
Dispose
会触发静默回滚(因为
Dispose
很可能被调用,因为事务被异常中断,而引发另一个异常会令人讨厌地破坏第一个异常)。
/ Do not make this method virtual.
// A derived class should not be allowed
// to override this method.
public void Close()
{
   // Call the Dispose method with no parameters.
   Dispose();
}