VB的Dim和C#的var一样吗?

Bru*_*ant 18 c# vb.net

这是一个小小的疑问:在VB上,我可以使用Dim声明变量.在C#中,我可以声明然后使用var.我更熟悉C#的复杂性,我知道var使用类型推断来确定变量的类型.但我不确定'Dim'是做什么的.

我似乎在SO上有这个问题,但它没有比较两个关键字.如果有区别,有人可以告诉我哪个?

Blu*_*eft 18

这取决于是否Option Infer指定.通常,以下是等效的:

'VB.Net
Dim myVar
Dim myString = "Hello world!"
Dim myString2 As String = "Hello world!"
Run Code Online (Sandbox Code Playgroud)
//C#
object myVar;
object myString = "Hello world!"; //Notice type is object, *not* string!
string myString2 = "Hello world!";
Run Code Online (Sandbox Code Playgroud)

但是,Option Infer启用后,Dim变得更像var是在同一行上初始化变量时:

'VB.Net
Option Infer On
Dim myVar
Dim myString = "Hello!"
Run Code Online (Sandbox Code Playgroud)
//C#
object myVar;
var myString = "Hello!"; //Or the equivalent:  string myString = "Hello!";
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会导致一些混淆,因为在声明点突然初始化变量意味着与以后初始化它不同:

'VB.Net
Option Infer On
Dim myVar1
myVar1 = 10
Dim myVar2 = 10

myVar1 = New MyClass() 'Legal
myVar2 = New MyClass() 'Illegal! - Value of type 'MyClass' cannot be converted to 'Integer'
Run Code Online (Sandbox Code Playgroud)

这可以通过启用来修复Option Strict,其中(除其他外)强制所有变量在声明时被赋予类型(隐式或非隐式).


Kon*_*lph 14

他们不一样.Dim在VB中只是意味着接下来是一个变量声明.

例如,这两个是等价的:

Dim x As String = "foo"
Run Code Online (Sandbox Code Playgroud)
string x = "foo"
Run Code Online (Sandbox Code Playgroud)

C#,var意味着变量声明的类型由编译器根据用法(初始化)推断.通过简单地省略声明的类型,可以在VB中实现相同的目的.但是,这也需要Option StrictOption Infer激活:

Dim x = "bar" ' Compiler infers type of x = string
Run Code Online (Sandbox Code Playgroud)
var x = "bar" // same here.
Run Code Online (Sandbox Code Playgroud)