? Finally
블록에서 Nothing
으로 설정하지 않으면 어떻게됩니까? 제 생각에는 객체가 GC로 표시 될 것이므로 Nothing
으로 설정하지 않으면 문제가 없습니다.왜 Finally 블록에서 Nothing으로 개체를 설정 하시겠습니까?</p> <pre><code>Dim o as SomeClass Try o = new SomeClass 'call some method on o here Catch(...) ... Finally o = Nothing End Try </code></pre> <p>왜 <code>Nothing</code>에 O를 설정 할 필요가있다 :이 VB.NET 코드에서
답변
개체가 try catch에서 사용하기에 안전하지 않은 경우이 작업을 수행해야합니다. 이 스트림이 예를 들어 스트림 인 경우 스트림을 닫은 다음 아무 것도 설정하지 않은 것을 볼 수 있습니다. 항상 올바른 일은 아니지만이 코드는 많이 보입니다. 이 바보 같은 예입니다 Allthough
는 그것이 더 이상 개체의 인스턴스로 설정되어 있기 때문에 지금 외부 O를 참조 할 수 없습니다 뜻입니까이 코드를Sub Main()
Dim o As String
Try
o = "Hello"
Console.Out.WriteLine("hi {0}", o)
Catch ex As Exception
' do something here
Finally
o = Nothing
End Try
' unable to do something here
End Sub
을 고려하십시오. 그것이 많은 사람들이하는 이유입니다. 함수에 있고 함수가 끝나면 Nothing으로 설정할 필요가 없습니다. 객체가 범위를 벗어나지 만 많은 사람들이 물건을 Nothing
으로 설정합니다. 잘못된 코드와 잘못된 코드를 고려할 것입니다. SomeClass가 .Dispose 방법이있는 경우 디자인
그 말은, 연습을 마치면 일단 내가 끝나면 모든 객체를 '아무것도'로 설정해야합니까? – badmaash
@badmaash : 아니요. krystan이 "객체가 안전하지 않은 경우"라고 말했기 때문에. 대다수의 시간은 필요하지 않습니다. –
올바르게 설계된 클래스는 처리 된 후에 사용하려고하면 예외를 throw합니다. 그것을 Nothing으로 설정하는 것은 불필요합니다. 그리고 사람들이 실제로 뭔가를한다고 생각하기 때문에 들어갈 수있는 나쁜 패턴이라고 주장 할 것입니다. 코드에 노이즈가 추가됩니다. 그리고 언급 한 바와 같이 부적절한 사용으로 예외를 throw하지 않는 클래스 *가 잘못 설계된 경우 확실히 범위를 사용해야합니다. 'Using' 문이 가장 쉽지만, 새로운 함수로 감쌀 수 있습니다. –
개체가 try .. catch .. finally 블록 외부에서 사용하기에 안전하지 않기 때문입니다. 그것은 일관된 상태에 있음을 보장하지 않기 때문에, 사용하지 않아도되는 것을 명백하게하기 위해 Nothing으로 설정됩니다.
사실. 아니. 이는 VB6 및 COM 일에서 'Nothing'으로 설정하면 실제로 개체의 참조 횟수가 감소합니다. –
, 당신은 그것을 사용해야합니다 http://stackoverflow.com/questions/12368/how-to-dispose-a-class-in-net –
가능한 중복 of [클래스 대 Dispose() 호출에 대한 null] (http://stackoverflow.com/questions/574019/calling-null-on-a-class-vs-dispose) (최고 등급 응답은 C#에서는 VB.NET과 완전히 동일합니다. 객체를 Nothing으로 설정하면 VB.NET에서는 완전히 불필요합니다. 테 VB의 VB와 같은 COM 기반 버전과는 다릅니다.) –