关于vb.net:VB的Dim和C#的var一样吗?

Is VB's Dim the same as C#'s var?

这是一个小小的疑问:在VB中,我可以使用dim声明变量。在C中,我可以使用var声明。我更熟悉C的复杂性,我知道var使用类型推断来确定变量的类型。但我不知道"昏暗"是怎么回事。

我似乎一直在问这个问题,但它没有比较两个关键词。如果有什么不同,有人能告诉我是哪一个吗?


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

1
2
3
4
'VB.Net
Dim myVar
Dim myString ="Hello world!"
Dim myString2 As String ="Hello world!"
1
2
3
4
//C#
object myVar;
object myString ="Hello world!"; //Notice type is object, *not* string!
string myString2 ="Hello world!";

但是,在启用Option Infer的情况下,当变量在同一行上初始化时,Dim变得更像var

1
2
3
4
'VB.Net
Option Infer On
Dim myVar
Dim myString ="Hello!"
1
2
3
//C#
object myVar;
var myString ="Hello!"; //Or the equivalent:  string myString ="Hello!";

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

1
2
3
4
5
6
7
8
'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'

这可以通过启用Option Strict来解决,它(除其他外)强制在声明时为所有变量指定一个类型(隐式或非隐式)。


它们不一样。vb中的Dim仅仅意味着后面的是一个变量声明。

例如,这两个是等效的:

1
Dim x As String ="foo"
1
string x ="foo"

C#中,var表示编译器根据用法(初始化)推断变量声明的类型。在VB中,只要省略声明的类型就可以实现同样的效果。但是,这也要求激活Option StrictOption Infer

1
Dim x ="bar" ' Compiler infers type of x = string
1
var x ="bar" // same here.


这取决于你在vb.net上写的

1
dim x = 1

那么它与C var相同。

或者你可以写

1
dim x as integer = 1

和C一样#

1
int x = 1;

从vb.net 9.0开始,不需要使用带有initialize语句的类型

http://msdn.microsoft.com/en-us/library/ms364068(v=vs.80).aspx


vb中的Dim本身不做任何事情,它只是一个关键字,意味着语句的其余部分与声明变量有关。它是一个BASIC关键字,来自时间的迷雾,当你不能声明普通变量时,它的意思是"dimension",但是你必须声明数组的"dimension"。

如果,在你的头脑中,你忽略了Dim,比较剩下的,你会发现vb和c非常相似,除了c做了错误的循环(你可以猜出我是用哪种语言长大的),而且,像c一样,把类型放在第一位(或使用var)和变量名放在第二位。


这是斯科特·汉塞尔曼写的

For c# var:

...[var is] a new keyword that means,
"I want to declare a variable, but I’m
too lazy to write out its type."

One way to look at the power of VB's
Dim operator is to say,

Dim kind of means,"I want to declare
a variable but I can't tell you much
about how it behaves until much
later."

Dim lets you do actual late-binding while in C# (today) you do late-binding with reflection.


var关键字是由变量中指定的数据类型指定的。但dim是不变的,可以用于任何类型。


Dim表示"dimension",在vb.net中用于声明变量。它基本上意味着"保留一些/足够的空间来容纳一个A型_uuuuuu"。数据类型稍后出现;通常在同一行。

正如您所提到的,c中的var实际上是一种快捷方式,告诉编译器根据第一次分配的值推断数据类型。