используя блок Vs функциональный блок - PullRequest
1 голос
/ 10 августа 2011

Я хочу знать, что является лучшим способом управления памятью с обеих причин

С использованием с использованием

 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 ]

5 голосов
/ 10 августа 2011

Первый using располагает ресурсами объекта, а должен освободить ресурсы, исцеленные объектом.

Где во втором методе вы полагаетесь на сборщик мусора, чтобы сделать это для вас, однако сборщик мусора сделает это в какой-то недетерминированной точке, пока ваше приложение выполняется.

Здесь стоит упомянуть, что оператор using преобразуется во что-то вроде:

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

Таким образом, он оборачивает весь объект в блоке try / finally, а когда он заканчивается, он всегда вызывает dispose для освобождения ресурсаесли исключение выдается в процессе внутри использования, мы уверены, что наш ресурс, вероятно, расположен.

1 голос
/ 10 августа 2011

Лучше всего использовать , используя .

Оператор using обеспечивает вызов метода Dispose, даже если при вызове методов объекта вызывается исключительная ситуация.Вы можете достичь того же результата, поместив объект в блок try, а затем вызвав Dispose в блоке finally;на самом деле, именно так оператор using переводится компилятором.

1 голос
/ 10 августа 2011

using оператор полезен только для объектов, реализующих IDisposable, обычно там, где базовый ресурс неуправляем.

См. Это: http://msdn.microsoft.com/en-us/library/yh598w02.aspx

Для других сценариев рекомендуетсяпозволить автоматическому сборщику мусора выполнять свою работу.

Смотрите это: http://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx

0 голосов
/ 10 августа 2011

Блок using обычно используется для объекта, который содержит ссылки на неуправляемые объекты или другие вещи, которые не будут собирать мусор. Использование блока может использоваться только с объектами, которые поддерживают интерфейс IDisposible. Не влияет на то, когда значение получает мусор.

0 голосов
/ 10 августа 2011

первое лучше - по крайней мере для случаев, когда MyEntities реализует IDisposable ... но лучше esp. если происходит какое-либо исключение ...

см. http://msdn.microsoft.com/en-us/library/yh598w02.aspx

...