使用块Vs功能块

时间:2011-08-10 04:44:47

标签: c# memory-management using

我想知道哪个是关于内存管理的更好方法来自两个原因

使用使用

 public void AddUser(User user)
        {
            using (var myentities = new MyEntities())
            {
                myentities .AddTotblUsers(user);
                myentities .SaveChanges();
            }
        }

不使用使用

public void AddUser(User user)
            {
                var myentities = new MyEntities();

                myentities .AddTotblUsers(user);
                myentities .SaveChanges();

            }

哪一个从内存中删除第一个对象?第一,第二或两者相同?

5 个答案:

答案 0 :(得分:5)

第一个using处置对象资源,应该释放对象修复的资源。

在第二种方法中,您依靠垃圾收集器为您执行此操作,但是垃圾收集器将在您的应用程序执行时在某些非确定性点执行此操作。

这里值得一提的是,using语句被转换为:

{
    Entities myentities = new MyEntities();
    try
    {
        myentities.AddTotblUsers(user);
        myentities.SaveChanges();
    }
    finally
    {
        if (myentities != null)
            ((IDisposable)myEntities).Dispose();
    }
}

因此它将整个对象包装在try / finally块中,当完成使用它时,它会调用dispose来释放资源,即使在使用过程中抛出异常,我们也确定我们的资源可能被处理掉了。

答案 1 :(得分:1)

using语句仅对实现IDisposable的对象有用,通常在底层资源不受管理的情况下。

请参阅:http://msdn.microsoft.com/en-us/library/yh598w02.aspx

对于其他方案,建议让自动垃圾收集器完成其工作。

请参阅:http://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx

答案 2 :(得分:1)

使用using是更好的方法。

  

using语句确保即使调用Dispose也会调用   在对象上调用方法时发生异常。您可以   通过将对象放在try块中来实现相同的结果   然后在finally块中调用Dispose;其实这是怎么回事   using语句由编译器翻译。

答案 3 :(得分:0)

第一个更好 - 至少在MyEntities实现IDisposable的情况下......但是更好的是esp。如果发生任何异常......

请参阅http://msdn.microsoft.com/en-us/library/yh598w02.aspx

答案 4 :(得分:0)

using块通常用于包含对未管理对象或其他不会被垃圾收集的内容的引用的对象。使用块只能与支持IDisposible接口的对象一起使用。它对值何时被垃圾收集没有影响。