What is the equivalent of VB's “Dim” statement in C#?
拿起C#,似乎找不到任何有用的参考,除了例子。
那么,C#中的Dim是什么?
-
你在问什么C#相当于VB.nets Dim是什么?
-
就此而言,世界上哪些Dim代表VB.NET?我知道它用于什么,但我仍然不知道它应该是什么意思。
-
@Ben Dim是维度的缩写
-
@spender:是的,当我最初读到这篇文章时,我以为他在说C#中有一个Dim关键字
-
@Ben McCormack:正如PeanutPower所说,DIM是"维度"的缩写,因为它的最初用途是创建数组,例如: DIM foo(100) AS INTEGER。这是来自遥远和衰落的QBasic记忆,但我认为"AS INTEGER"是必要的,因为数组没有使用标量变量使用的类型前缀字符("%表示整数,$表示字符串等)。作为扩展名,你也可以编写像DIM bar AS STRING这样没有数组维度的东西来创建不需要前缀字符的标量变量(所以你可以在以后引用bar而不是$bar)。
-
@Wyzard,谢谢你的解释。我总是想知道:-)。
在VB中,Dim声明一个特定类型的变量(或变量类型的变量,如果你没有指定一个)。如果Dim x as Foo,则声明一个名为x的Foo类型的变量。
在C#中,等效的是声明类型后跟变量的名称,如:
您也可以在同一步骤中指定:
1 2
| Foo x = new Foo ();
int i = 6; |
C#支持类型推断,所以你也可以这样做:
1 2 3
| // Compiler infers type of x and i based on this assignment.
var x = new Foo (); // x is now of type Foo
var i = 10; // i is now of type int |
VB中没有相应类型的Dim类似于在C#中将类型声明为Object:
1
| object o = ...; // An object instance can hold any value or reference type. |
-
是的,但var主要用于LINQ,如果你做var MyVar = 500; MyVar ="Change to String";你会得到一个错误..其他语言没有这个限制
-
最后一个是隐式类型变量的示例;类型推断是不同的。
-
@Roboto:C#主要是静态类型的。你不能做你描述的,因为变量的类型是不可变的:一旦你声明为一个类型,就像它保持的方式。 @Jason:隐式输入不能在没有类型推断的情况下发生。它们非常紧密地联系在一起。本质上,类型推断是"右侧"发生的事情,因此编译器可以将i绑定到特定类型。
-
Everythings一个对象!我认为没有类型推断
-
@Roboto:那不是真的。作为一种强大且(大部分)静态类型的语言,类型在C#中非常重要。有很多例子可以推断出类型。 (我想你可能误解了什么类型推断的定义 - 你有没有检查过msdn.microsoft.com/en-us/library/bb384061.aspx?)
-
@Roboto:C#3中绝对存在类型推断,尽管通常该短语用于描述泛型方法的推断类型参数。 var是隐式类型 - 将其称为类型推断形式是合理的。
-
@Roboto,"每件事都是对象"并不是真的。 C#和.NET也使用结构体,结构体是一种"值类型"(以及整数和其他数字)。所有对象都是"引用类型"。这在内存管理方面非常重要,因为值类型在堆栈上分配,引用类型从堆中分配。对于要作为参数或返回值传递的值类型,它必须"装箱",以便它可以存储在堆中,并具有独立于堆栈的生命周期。
-
@John,我会说C#完全是一种强类型语言。即使在引入动态类型的C#4中,"动态"本身也是用于引用动态数据和方法的"强类型"。在该上下文中,它是动态的,但是类型为"动态"的变量不能用于引用静态类型。通过使用隐式类型,泛型和类型推理,C#比大多数其他强类型语言在强类型方面更灵活,但它仍然是一种强类型语言。
-
@Cylon:我认为你误读了我的引用:我说"C#是一个强大的(大多数)静态类型......",这意味着它的所有强类型和大多数静态类型。"其静态类型"的例外是dynamic,它推迟了运行时会发生的某些步骤。
-
@John,我认为问题是如何处理声明为动态的变量,我们真的不知道这一点,直到我们开始使用它。 (也许你已经拥有了;我现在已经完全没有走这条路了。)我的理解是"动态"仅限于使用动态语言和数据。例如,您无法定义List 并将其分配给动态变量。 (如果我错了,那么,那可能是件好事!)
-
@cylon猫:你错了。你可以在C#4中用动态做各种各样的事情 - 尽管它主要用于与动态语言互操作。
-
@Jon,然后我会期待学到很多东西。但是,目前我需要学习为WCF RIA服务编写域服务提供程序,这将让我有一段时间的乐趣。
假设您在VB中表示Dim,C#使用var或类型名称来声明新类型
1 2 3
| string myString ="Hello";
// is the same as
var myString ="Hello"; // type is inferred |
请注意,var关键字不是变体类型,就像在VB中一样。它是一个隐式类型变量。
这实际上有点棘手,因为Dim可以以多种方式使用。第一种情况是在声明变量时明确提供变量的类型。在这种情况下,它对应于包含类型名称的C#声明:
1 2 3 4
| // Visual Basic
Dim num as Integer
// C#
int num; |
第二种情况是使用初始化表达式,但不明确指定类型。在这种情况下,VB(至少是最新版本)使用类型推断来推断类型。这对应于C#var关键字:
1 2 3 4
| // Visual Basic
Dim str ="Hello world"
// C#
var str ="Hello world" |
最后,还有第三种情况 - 您可以声明Visual Basic变量而不提供任何类型并且不提供初始化表达式(至少在Option Strict关闭时)。在这种情况下,VB.NET将变量声明为类型Object的值,但也允许您调用该对象的任何方法。这与C#4.0对新的dynamic关键字的作用非常接近:
1 2 3 4 5 6 7 8 9
| // Visual Basic
Dim sth
sth = new Random ()
sth .Next()
// C#
dynamic sth ;
sth = new Random ();
sth .Next(); |
[编辑]
最后,在Visual Basic中使用Dim的最后一种情况是声明数组。在C#中,数组被视为另一种数据类型,因此声明类似于我之前为整数/字符串编写的声明:
1 2 3 4 5 6
| // Visual Basic
Dim ints (10, 10) as Integer
// C# - we need to initialize the array if size is specified
int[, ] ints = new int[10, 10];
// C# - we can use type inference too
var ints = new int[10, 10]; |
[/编辑]
(我不是VB专家,但我认为这是三种可能的情况。如果我错了,请纠正我!)
类似的等价物就像
或任何其他数据类型,如
1 2
| int myInt;
string myString; |
var也可以用作隐式类型。其他人将被明确键入。 var虽然是为LINQ查询引入的。
我可以建议学习C#3.0(以及后来,可能是Nutshell中的C#3.0和深度中的C#)来学习C#。学习语言基础并开始"用C#思考"可能是一个好主意,而不是试图将你的想法从VB翻译或"转换"到C#(或任何其他语言)。
编辑:那说;你确实希望将你正在学习的新语言与你已经知道的语言进行比较,以了解语言之间的差异。在我看来,在学习一门新语言时,更多的是掌握原则和基本差异:)
-
在开始时我不建议在深度中使用C#。 它真正针对那些已经合理掌握C#1的人。
-
@Skeet:我同意。 我猜我应该更清楚。 第一个(学习C#3.0)是一本很好的书,至少我是这么认为的。 PS:我很荣幸能对你的回答发表评论^^
Dim是用于声明VB.NET中使用的变量的关键字。我不知道C#中的任何用法。我会说它的(粗略的)等价物是var关键字,只要我们讨论的是VB 9和C#3。但是我认为在我们知道什么是预期的问题之前进入有关细节的斗争是没有用的;)
-
Downvoted;在C#中没有"Dim"的等价物。在VB中,Dim关键字用于声明变量。在C#中,这种意图隐含在使用类型来开始语句。可以使用C#中的var关键字代替类型名称,但它仍然是一个强类型,并且它要求在同一语句中初始化该变量。用于变量的类型是从分配给变量的数据类型推断出来的。
-
你是绝对正确的,唯一让Dim大致相当于var的东西是它们用于在两种语言中声明一个变量。但是,在VB的第9版中,打开Option Infer,您可以使它们以非常类似的方式运行。