C# 如何在没有IDisposable的情况下正确处理对象

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

在我的ASP.NET MVC应用程序中,我有这样一个控制器:

[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:


这个问题在对问题本身的评论中已经得到了迂回的回答,但总结一下Codingyshi、Evk和Fabjan在那里所说的话

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