C# 如何在没有IDisposable的情况下正确处理对象
在我的ASP.NET MVC应用程序中,我有这样一个控制器:C# 如何在没有IDisposable的情况下正确处理对象,c#,asp.net-mvc,C#,Asp.net Mvc,在我的ASP.NET MVC应用程序中,我有这样一个控制器: [HttpPost] public ActionResult CreateTestCategory(TestCategory testCategory) { BLL.Admin.CreateTestCategory obj = new BLL.Admin.CreateTestCategory(); obj.Create(testCategory.TestCategoryName); //((IDisposabl
[HttpPost]
public ActionResult CreateTestCategory(TestCategory testCategory)
{
BLL.Admin.CreateTestCategory obj = new BLL.Admin.CreateTestCategory();
obj.Create(testCategory.TestCategoryName);
//((IDisposable)obj).Dispose();
return RedirectToAction("TestCategory", "Admin");
}
这里的BLL.Admin.CreateTestCategory
位于另一层,它没有实现IDisposable。它只进行一些EF数据库调用,这些调用使用存储库模式以自己的方式进行处理,所以不用担心。但在这个控制器中,我创建了该类的对象obj
。完成后,我想手动销毁/处置obj
。所以我注释掉的那行,这是处理obj
的唯一方法吗
我没有使用
BLL.Admin.CreateTestCategory
来实现IDisposable的原因是,可能有一百个类似的类。我不想逐一实现IDisposable,然后使用using
块,这很痛苦,我只想在创建它之后手动处理它。我也不想等待GC。那么,什么是最可靠的方法呢?这个问题在对问题本身的评论中已经得到了迂回的回答,但总结一下Codingyshi、Evk和Fabjan在那里所说的话
IDisposable
用于清理不由.NET运行时管理的资源。如果需要清理与数据库的连接、文件锁等,那么确实应该使用IDisposable
。对于托管内存,垃圾收集器在几乎任何情况下都会比您更好地处理它。可以使用析构函数,但通常不需要
参考资料:
- 处置模式上的MSDN:
- 终结器上的MSDN:
IDisposable
用于清理不由.NET运行时管理的资源。如果需要清理与数据库的连接、文件锁等,那么确实应该使用IDisposable
。对于托管内存,垃圾收集器在几乎任何情况下都会比您更好地处理它。可以使用析构函数,但通常不需要
参考资料:
- 处置模式上的MSDN:
- 终结器上的MSDN:
IDisposable
(您不想,但假设您尝试了),您将在Dispose()
实现中编写什么?鉴于@Evk的注释,您可能可以在上实现它。如果您没有任何要处理的内容,那么让GC来完成它的工作。只需确保所有存储库
和工作单元
都在处理托管资源。您不能只是从实例化的.NET对象中回收内存,只有GC可以这样做。实现IDisposable
并调用Dispose
也不能做到这一点。所以你应该让它保持原样,让GC来完成它的工作。这是因为它们听起来像一种方法,即CreateTestCategory
听起来像一种方法。更好的做法是将它们命名为名词,使它们听起来像一个物体。因此,更好的名称应该是TestCategoryCreator
或TestCategoryService
或TestCategoryManager
。因此,假设您决定为该类实现IDisposable
(您不想,但假设您尝试过),您将在Dispose()
实现中编写什么,也许你可以在上实现它。如果你没有任何东西要处理,那么让GC来完成它的工作。只需确保所有存储库
和工作单元
都在处理托管资源。您不能只是从实例化的.NET对象中回收内存,只有GC可以这样做。实现IDisposable
并调用Dispose
也不能做到这一点。所以你应该让它保持原样,让GC来完成它的工作。这是因为它们听起来像一种方法,即CreateTestCategory
听起来像一种方法。更好的做法是将它们命名为名词,使它们听起来像一个物体。因此,更好的名称应该是TestCategoryCreator
或TestCategoryService
或TestCategoryManager
。