C # Form.Close 대 Form.Dispose


88

저는 C #을 처음 접했고 이전 게시물을 보려고했지만 좋은 답을 찾지 못했습니다.

단일 양식이있는 C # Windows Form 응용 프로그램에서 Form.Close()더 나은 또는 Form.Dispose()?

MSDN은 개체 내의 모든 리소스가 닫히고 Close가 호출되면 양식이 삭제된다고 말합니다. 그럼에도 불구하고, 나는 Close가 아닌 Dispose를 따르는 몇 가지 온라인 예제를 보았습니다.

하나가 다른 것보다 이점이 있습니까? 어떤 시나리오에서 하나를 다른 것보다 선호해야합니까?


약간 다른 질문, 동일한 대답, IMO : 즉, Close와 Dispose는 일반적으로 동일하지만 Close를 두 번 이상 호출 할 수 있다는 점만 다릅니다.
ChrisW

2
@Chrisw : Dispose를 두 번 이상 호출 할 수도 있습니다.
Henk Holterman

@ChrisW, Dispose는 두 번 이상 실행되도록 설계되어야합니다. bluebytesoftware.com/blog/…
Steven Evers

나에게 가까운 === 닫기보다는 처분 == form.Visible = false; 나는 닫기가 처분보다 더 부드러운 방법이 될 것이라고 기대했습니다.
Pete Kirkham

4
@Pete Kirkham : 당신이 원하는 경우에 form.Visible = false;당신이 호출 할 수 있습니다 form.Hide(). 사실, form.Hide()간단히 this.Visible = false;.
Dirk Vollmar

답변:


171

MSDN 의이 포럼에서 알려드립니다.

Form.Close()win32 창을 종료하기 위해 적절한 Windows 메시지를 보냅니다. 해당 프로세스 중에 양식이 모달로 표시되지 않으면 Dispose가 양식에서 호출됩니다. 양식을 삭제하면 양식이 보유하고있는 관리되지 않는 리소스가 해제됩니다.

당신이 할 경우 form1.Show()또는 Application.Run(new Form1())때, 폐기가 호출됩니다 Close()라고합니다.

그러나 form1.ShowDialog() 양식을 모달로 표시하려면 양식이 삭제되지 않으므로 form1.Dispose()직접 전화를 걸어야합니다. 양식을 직접 폐기하는 것에 대해 걱정해야 할 유일한 시간이라고 생각합니다.


첫 번째 버전에 견적이 포함 되었습니까? +1하여 보상합니다.
Henk Holterman

@Dan 첫 번째 버전이 빨려 ... (미안해 @Kyra)
jjnguy을

13
이것은 msdn.microsoft.com/en-us/library/… 에서 MSDN이 언급 한 것과 다소 다릅니다 . "양식이 닫기에서 처리되지 않는 한 가지 조건은 MDI (다중 문서 인터페이스)의 일부일 때입니다. 이 경우 양식의 모든 컨트롤을 가비지 수집으로 표시하려면 Dispose를 수동으로 호출해야합니다. " 그러나 간단한 샘플로 모달 폼의 폐기 여부를 쉽게 확인할 수 있어야한다.
Dirk Vollmar 2010-06-22


14

일반적으로 저는 메서드를 직접 호출하거나 "using"블록으로 래핑하여이를 제공하는 모든 클래스에 대해 Dispose 메서드를 명시 적으로 호출하는 것을 항상 옹호합니다.

대부분의 경우 IDisposible을 구현하는 클래스는 해제해야하는 관리되지 않는 리소스를 래핑하기 때문에 그렇게합니다. 이러한 클래스에는 보호 장치 역할을하는 종료자가 있어야하지만 Dispose를 호출하면 해당 메모리를 더 일찍 확보하고 오버 헤드를 줄이는 데 도움이됩니다.

Form 객체의 경우 Kyra의 링크에서 언급했듯이 Close 메서드는 사용자를 대신하여 Dispose를 호출하도록 문서화되어 있으므로 명시 적으로 수행 할 필요가 없습니다. 그러나 나에게 그것은 항상 구현 세부 사항에 의존하는 것처럼 느껴졌습니다. 구현 변경 / 오류를 방지하고 명확하게하기 위해이를 구현하는 클래스에 대해 항상 Close와 Dispose를 모두 호출하는 것을 선호합니다. 올바르게 구현 된 Dispose 메서드는 여러 번 호출해도 안전해야합니다.



6

호출하지 않는 것은 Close아마도 당신에게 그 이유를 구체적으로 말할 수는 없지만 다소 중요하다고 생각할 많은 Win32 메시지를 보내는 것을 우회 하는 것입니다.

Close외부인 (폼에 대한)이 감시 FormClosing하고 FormClosed그에 따라 대응할 수 있도록 이벤트를 발생시키는 (취소 할 수 있음) 이점이 있습니다 .

나는 여부를 명확하지 않다 FormClosing및 / 또는 FormClosed단순히 양식을 처리하지만 난 당신에게 실험하는 것을 떠날거야 경우에 발생합니다.


2
양식을 삭제하면 마감 및 마감 이벤트가 호출되지 않습니다.
매트릭스

4
MDI-자식 창을 통해 모달 - 양식에 사용하는 경우 호출 폐기 방법은 윈도우의 깜박 거림 원인이
dotNETbeginner

1

사용 using은 꽤 좋은 방법입니다.

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}

0

Close ()-관리 자원을 일시적으로 닫고 다시 열 수 있습니다.

Dispose ()-관리되거나 관리되지 않는 자원을 영구적으로 제거합니다.


3
이는 양식이를 사용하여 표시된 경우에만 해당됩니다 ShowDialog(). 그렇지 않으면 Close()양식도 폐기됩니다.
Peter Duniho

-1

양식에서 form.close ()를 사용하고 양식의 FormClosing 이벤트를 설정하고이 이벤트에서 form.close ()를 사용하면 무제한 루프에 빠지고 인수가 범위를 벗어 났고 해결책은 양식을 변경하는 것입니다 FormClosing 이벤트에서 form.dispose ()로 .close (). 이 작은 팁이 도움이 되었기를 바랍니다 !!!


-1

VS 진단 도구로 방금 실험 한 것은 this.Close ()라고 부르고 formclosing 이벤트가 트리거된다는 것입니다. 그런 다음 다른 많은 객체를 처리하는 Formclosing 이벤트의 끝에 this.Dispose ()를 호출하면 모든 것이 훨씬 더 매끄럽게 정리됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.