我在数据库和WPF C#应用程序的帮助下自动执行某些任务。其中一项任务是每月报告,查看上个月的活动。我使用DateTime选择器来选择报告的开始和结束日期,但通常它将是任何月份的第一天和最后一天。在我的视图模型中,我有绑定属性到开始日期时间和结束日期时间,它们默认为上个月的第一天和最后一天。当我选择一个新的开始日时,我的代码将使其成为所选月份的第一天,然后将结束日期设置为该月的最后一天,如下所示:
private DateTime _d1 = new DateTime(DateTime.Today.Year, DateTime.Today.Month - 1, 1); //First Day of previous month
private DateTime _d2 = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1); //Last Day of previous month
public DateTime d1
{
get { return _d1; }
set
{
if (value != _d1)
{
_d1 = new DateTime(value.Year, value.Month, 1);
_d2 = new DateTime(value.Year, value.Month + 1, 1).AddDays(-1);
RaisePropertyChangedEvent("d1");
RaisePropertyChangedEvent("d2");
}
}
}
所以我的问题是:DateTime
引用的旧_d1
(_d2
相同)仍在某处分配。在分配新内存之前,有没有办法取消引用该内存块?我认为垃圾收集可能就是这样做的,但是让我把这些东西悬挂起来似乎很奇怪。来自C / C ++背景,我觉得这绝对不行。
答案 0 :(得分:1)
在DateTime
的情况下你很好。它的所有托管内存和GC都可以获得它。
你做需要注意使用非托管资源的对象,特别是如果它们实现IDisposable
。
对于此类对象,您应该在完成后调用Dispose
或在using
块中使用它们,以便在它们离开范围时处理它们:
using (var someDisposable = new DisposableObject())
{
//do stuff with someDisposable
}
Bitmap
是一个很好的例子,如果你忘了这个会咬你的话:)它拥有一个大的未管理的GDI位图,如果你没有&将永远 #39; t手动处理它。