Использование метода dispose () вместо метода close () для формы - PullRequest
5 голосов
/ 24 сентября 2011

Что происходит, когда я закрываю форму, которая была открыта с помощью Show(), используя Dispose() вместо Close()?Может кто-нибудь подробно рассказать, что происходит в методе Dispose()?

Ответы [ 3 ]

6 голосов
/ 24 сентября 2011

Основное различие между Close() и Dispose() заключается в том, что при вызове метода Close() любой управляемый ресурс может быть временно закрыт и снова открыт. Это означает, что с одним и тем же объектом ресурс может быть вновь открыт или использован. Где, как метод Dispose() навсегда удаляет любой ресурс ((не) управляемый) из памяти для очистки, и ресурс больше не существует для дальнейшей обработки.


Или просто общее утверждение. С помощью объекта соединения вызов Close() освободит соединение обратно в пул. Вызов Dispose() вызовет Close(), а затем установит для строки подключения значение null.

Некоторые объекты, такие как Stream, реализуют IDisposable, но метод Dispose доступен только в том случае, если вы сначала приведете объект к IDisposable. Тем не менее, он предоставляет метод Close().

Я бы всегда утверждал, что вы должны вызывать Dispose() для любого объекта, который реализует IDisposable, когда вы закончите с этим объектом. Даже если это ничего не делает. Jit-компилятор все равно оптимизирует его из окончательного кода. Если объект содержит Close(), но не Dispose(), тогда вызовите Close().

Вы также можете использовать оператор using для IDispoable объектов

using(SqlConnection con = new SqlConnection())
{
    //code...
}

Это вызовет Dispose() в SqlConnection при выходе из блока.

3 голосов
/ 24 сентября 2011

Декомпиляция двух методов (Dispose и Close) оказывается, что последний выполняет две дополнительные проверки и затем вызывает Dispose, вот так:

object[] objArray;
if (base.GetState(262144))
{
    throw new InvalidOperationException(SR.GetString("ClosingWhileCreatingHandle", new object[] { "Close" }));
}
if (base.IsHandleCreated)
{
    this.closeReason = CloseReason.UserClosing;
    base.SendMessage(16, 0, 0);
    return;
}
base.Dispose();

Из документации:

Когда форма закрыта, все ресурсы, созданные внутри объекта, закрываются, и форма удаляется. [...] Два условия, когда форма не расположена при закрытии, это когда (1) она является частью приложения с интерфейсом с несколькими документами (MDI), а форма не отображается; и (2) вы отобразили форму, используя ShowDialog. В этих случаях вам нужно будет вызвать Dispose вручную, чтобы пометить все элементы управления формы для сбора мусора.

Надеюсь, это поможет.

1 голос
/ 24 сентября 2011

На самом деле, в этом случае Close() и Dispose() совершенно разные:

Close закрывает форму, отправив соответствующее сообщение Windows. Вы сможете снова открыть форму, используя Open()

Dispose полностью удаляет ресурсы формы, и вы не сможете снова использовать экземпляр формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...