【问题标题】:Disposing of Elements in C#在 C# 中处理元素
【发布时间】:2015-03-11 00:09:18
【问题描述】:

我在数据库和 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");
            }
        }
    }

所以我的问题是:_d1 引用的旧 DateTime_d2 相同)仍然分配在某个地方。有没有办法让我在分配新的内存块之前取消引用该内存块?我认为垃圾收集可能会这样做,但让事情像那样悬空对我来说似乎很奇怪。有C/C++背景,感觉这肯定不行。

【问题讨论】:

  • 否;垃圾收集器为您做所有事情。 (另外,无论如何这是一个值类型)
  • 顺便说一句,您不能以这种方式可靠地添加月份,因为 months 参数必须是 1 到 12。请改用 AddMonths 方法。
  • @MattJohnson 谢谢。 . .我现在在我的日期逻辑中也看到了更多的陷阱,很高兴你指出了这一点。

标签: c# datetime


【解决方案1】:

DateTime 的情况下,你很好。它的所有托管内存和 GC 都会得到它。

确实需要小心使用非托管资源的对象,特别是如果它们实现了IDisposable

对于此类对象,您应该在处理完它们后调用Dispose,或者在using 块中使用它们,以便它们在离开作用域时被释放:

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

Bitmap 是一个很好的类的例子,如果你忘记这一点,它会咬你:) 它拥有一个大型的非托管 GDI 位图,如果你不这样做,将需要 永远 来清除手动处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2014-08-06
    相关资源
    最近更新 更多