“Using”语句在C#中如何翻译成VB?

56
例如:
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帖子的评论中讨论的那样,这个问题更关注VS2003中Using的一种实现。指出Using直到.NET 2.0(VS2005)才被引入。JaredPar发布了一个等效的解决方法。


2
搜索 "using关键字 C#" 或其变体。 - James Gregory
1
从Visual Basic编程指南:[如何处置系统资源(Visual Basic)](http://msdn.microsoft.com/en-us/library/wydd5hkd.aspx) - DavidRR
1
对于那些寻找类似于using指令(例如using System.Net;)的等效方法的人,答案在这里:https://dev59.com/CVHTa4cB1Zd3GeqPUL-i - Martin Brown
1
在VB.net中,可以使用复合条目来完成C#需要两行代码才能实现的操作。此外,还可以使用隐式类型,例如: Using x = New MemoryStream(buffer1), y = New MemoryStream(buffer2) ..... End Using - Brain2000
5个回答

74

如果你使用.NET 2.0或更高版本(这意味着VB.NET v8编译器或更高版本),那么在VB中使用的语法与C#几乎相同。基本上,只需删除大括号并添加“End Using”即可。

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或更早版本,那么你需要下面的代码。因为using语句直到VS 2005,.NET 2.0才被引入 (参考链接)。感谢Chris!以下代码与using语句等效。

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

这个功能是在哪个版本的VB中添加的?我正在处理一些老代码,而Visual Studio 2003似乎无法识别它。 - Daniel
@hypoxide,据我所知,using语句从最初的VB.Net就已经存在了。我修改了代码,去掉了一些直到后来版本才可用的项目。你能否尝试一下,如果发现任何错误,请在这里添加? - JaredPar
14
在VB中,Using语句是在VS2005中才被引入的,之前的版本中并不可用。 - Chris Dunaway
1
Chris 是正确的:http://en.wikipedia.org/wiki/Visual_Basic_2005#Visual_Basic_2005_.28VB_8.0.29 - JaredPar
2
同时请注意,对于命名空间引用和别名声明,C# 中的 using 和 VB 的 Imports 是相同的。 - TGnat

5
重要的是要指出,使用using实际上被编译成多行代码,类似于lock等。
来自C#语言规范... 形式为的using语句
using (ResourceType resource = expression) statement

这里的ResourceType可以对应两种不同的扩展。当ResourceType是值类型时,其扩展为:

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

否则,当ResourceType是引用类型时,展开操作为:
{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        if (resource != null) ((IDisposable)resource).Dispose();
    }
}

基本上,在编译时它被转换为那段代码。没有叫做“using”的方法等等。我试图在VB.NET语言规范中找到类似的东西,但是我找不到任何东西,可能它做的事情完全相同。


3
那将是这样的:
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

3
重点是被“使用”的类必须实现IDisposable接口。

2

看起来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

你会收到NullReferenceException,就像在VB中一样,Using重新定义了成员类变量,而在C#中却没有这种情况!
当然,也许我漏掉了什么..

1
它不重新定义成员变量,而是在方法的范围内覆盖它。它仍然存在,并且具有相同的名称。 - jmoreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接