完成后如何取消类的实例 操作
本文关键字:实例 操作 取消 何取消 | 更新日期: 2023-09-27 18:33:41
我在我的项目中使用 MVVM。首先,请参阅编辑操作:
[HttpGet]
public async virtual Task<ActionResult> Edit(int code)
{
var attributeModel = await _attributeService.GetAsync(code);
EditAttributeViewModel attributeViewModel = mapper.Map(attributeModel, new EditAttributeViewModel());
return View(attributeViewModel);
}
在视图模型中,我像这样计算实例:
public class EditAttributeViewModel
{
private static int counter = 0;
public EditAttributeViewModel()
{
Interlocked.Increment(ref counter);
}
~EditAttributeViewModel()
{
Interlocked.Decrement(ref counter);
}
}
当完成Edit
动作并更改控制器时,再次回到那个Edit
动作,当看到counter
总是增加时,当我在页面之间移动时。我不想使用太多内存,为此我在控制器中Override
Dispose
方法如下:
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
但它不会改变,计数器总是增加.
如何清除实例
与C++不同,您无法按需释放内存。Dispose 模式用于释放非托管资源(文件处理程序、连接或非托管的图片,读取:在 .Net 内存管理之外保留的资源以及使用 IntPtr
的任何资源)。
您所能做的就是将所有引用设置为 null 并对类中的所有一次性类型调用 .Dispose()
,然后等到垃圾回收拾取它们。
不依赖于应用程序如何利用内存,这可能迟早会发生。如果您的应用程序经常实例化和取消引用对象,这可能会更快地发生,如果您的应用程序不这样做,则可能需要更长的时间。
你不应该依赖于终结器(在C++中看起来像解构器)被调用或何时调用。GC 在清理它时调用它。但前提是您尚未禁止显示它(通常在 Dispose 方法中执行此操作)。
因为counter
被标记为static
,所以它将在应用程序的整个生命周期中持续存在(与类的特定实例无关)。如果这不是所需的结果,并且您希望类的每个实例都有一个新的 counter
实例,请删除 static
关键字。
private int counter = 0;
这将为每个 EditAttributeViewModel
实例创建一个新的 counter
实例。