programing

"사용" 문은 C#에서 VB로 어떻게 변환됩니까?

projobs 2023. 5. 14. 23:23
반응형

"사용" 문은 C#에서 VB로 어떻게 변환됩니까?

예:

BitmapImage bitmap = new BitmapImage();

byte[] buffer = GetHugeByteArray(); // from some external source
using (MemoryStream stream = new MemoryStream(buffer, false))
{
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze();
}

에 대해 더 말해줄 수 있습니까?using?

편집:

JaredPar의 게시물의 댓글에서 논의되었듯이, 이 질문은 다음의 구현과 더 관련이 있습니다.UsingVS2003에서.라고 지적되었습니다.Using까지 소개되지 않았습니다.NET 2.0(VS2005).JaredPar도 동일한 해결 방법을 게시했습니다.

를 사용한다고 가정할 때 VB의 구문은 C#과 거의 같습니다.NET 2.0 이상(VB를 의미함).NET v8 컴파일러 이상).기본적으로 교정기를 제거하고 "사용 종료"를 추가합니다.

Dim bitmap as New BitmapImage()
Dim buffer As Byte() = GetHugeByteArrayFromExternalSource()
Using stream As New MemoryStream(buffer, false)
    bitmap.BeginInit()
    bitmap.CacheOption = BitmapCacheOption.OnLoad
    bitmap.StreamSource = stream
    bitmap.EndInit()
    bitmap.Freeze()
End Using

전체 설명서는 여기에서 확인할 수 있습니다.

편집

VS2003 또는 이전 버전을 사용하는 경우 아래 코드가 필요합니다.사용 설명서는 VS 2005까지 도입되지 않았습니다.NET 2.0(참조).감사합니다 크리스!다음은 사용 설명서와 동일합니다.

Dim bitmap as New BitmapImage()
Dim buffer As Byte() = GetHugeByteArrayFromExternalSource()
Dim stream As New MemoryStream(buffer, false)
Try
    bitmap.BeginInit()
    bitmap.CacheOption = BitmapCacheOption.OnLoad
    bitmap.StreamSource = stream
    bitmap.EndInit()
    bitmap.Freeze()
Finally
    DirectCast(stream, IDisposable).Dispose()
End Try

사용은 실제로 잠금 등과 유사한 다양한 코드 행으로 컴파일된다는 점을 지적하는 것이 중요합니다.

C# 언어 사양에서...양식의 사용 설명서

using (ResourceType resource = expression) statement

두 개의 가능한 확장 중 하나에 해당합니다.언제ResourceType값 유형이며, 확장은

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        ((IDisposable)resource).Dispose();
    }
}

그렇지 않으면 ResourceType이 참조 유형인 경우 확장은

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        if (resource != null) ((IDisposable)resource).Dispose();
    }
}

(끝 언어 사양 코드 조각)

기본적으로 컴파일 시 해당 코드로 변환됩니다.사용 등의 방법은 없습니다.저는 vb.net 언어 사양에서 비슷한 것을 찾으려 했지만 아무것도 찾을 수 없었습니다. 아마도 정확히 같은 일을 하는 것 같습니다.

이는 다음과 같습니다.

Dim bitmap As New BitmapImage()
Dim buffer As Byte() = GetHugeByteArray()
Using stream As New MemoryStream(buffer, False)
    bitmap.BeginInit()
    bitmap.CacheOption = BitmapCacheOption.OnLoad
    bitmap.StreamSource = stream
    bitmap.EndInit()
    bitmap.Freeze()
End Using

핵심은 "사용" 중인 클래스가 ID 일회용 인터페이스를 구현해야 한다는 것입니다.

처럼 보입니다.using(C#) 및Using(VB)에는 매우 중요한 차이가 있습니다.그리고 적어도 지금의 나에게는, 그것은 목적을 파괴할 수 있습니다.Using.

Imports System.IO
Class Program

    Private Shared sw As StreamWriter

    Private Shared Sub DoSmth()
        sw.WriteLine("foo")
    End Sub

    Shared Sub Main(ByVal args As String())
        Using sw = New StreamWriter("C:\Temp\data.txt")
            DoSmth()
        End Using
    End Sub
End Class

VB에서와 같이 NullReferenceException이 표시됩니다.UsingC#에 있는 동안 멤버 클래스 변수를 재정의하지 않습니다!

물론, 내가 뭔가를 놓쳤을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/887831/how-does-the-using-statement-translate-from-c-sharp-to-vb

반응형