在C#中处置元素

时间:2015-03-11 00:09:18

标签: c# datetime

我在数据库和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 ++背景,我觉得这绝对不行。

1 个答案:

答案 0 :(得分:1)

DateTime的情况下你很好。它的所有托管内存和GC都可以获得它。

需要注意使用非托管资源的对象,特别是如果它们实现IDisposable

对于此类对象,您应该在完成后调用Dispose或在using块中使用它们,以便在它们离开范围时处理它们:

using (var someDisposable = new DisposableObject())
{
   //do stuff with someDisposable
}

Bitmap是一个很好的例子,如果你忘了这个会咬你的话:)它拥有一个大的未管理的GDI位图,如果你没有&永远 #39; t手动处理它。