基本语法

数据类型与转换

.NET中,通用数据类型为Object型,VB 6.0中的Vairant类型已经取消了。对象类型赋值时不再需要Set关键字。例如:"

【VB.NET】

code.vb.net
Dim obj1 As New Object()
Dim obj2 As Object = obj1

【VC#.NET】

code.vc#.net
object obj1=new object();
object obj2 = obj1;

数据类型的转换有隐式转换和显式转换两种。隐式转换不需要任何转换形式,直接采用A=B的形式,系统会自动进行转换。显式转换则通过转换函数或其他的转换形式对数据类型进行强制转换。对于数值类型的转换而言,低精度类型向高精度类型转换影响不大,但高精度类型向低精度类型转换要损失部分信息。在VB.NET中,两种类型的转换都可以通过隐式转换完成。但VC#.NET是强类型的语言,要求后一种转换必须是显式转换。在VB.NET中,可以通过转换函数进行显式转换。如将数值转换为单精度型时使用CSng函数,转换为双精度型时使用CDb1函数,转换为字符型时使用CStr函数等。在VC#.NET中则需要进行强类型转换,转换时需要在要转换变量的名称前添加带小括号的类型名。下面的代码演示了数据类型的隐式转换和显式转换。

【VB.NET】

code.vb.net
Dim i As Integer = 10
Dim j As Double = 20.756
Dim k1 As Single =i
Dim k2 As Single = CSng(i)
Dim k3 As String = j.text-blue-400">ToString
'或Dim k3 As String =CStr()
text-blue-400">Console.text-blue-400">WriteLine("k1=(0),k2=(1),k3={2)"),k1,k2,k3)

【VC#.NET】

code.vc#.net
int i= 10;
double j=20.756;
float k1 =i;
float k2= (float)(i);
string k3 =j.ToString();
Console.WriteLine("k1={0},k2={1},k3={2)"),k1,k2,k3);

进行显式转换时还有一种情况,就是自定义转换类型。比如下面的代码中,p2是Object(object)类型的变量,它本身并没有X属性和Y属性。现在将p2指定为p1的引用,因为pl是Point类型的数据,有X属性和Y属性,所以现在p2也有这两个属性。但是调用时必须对它进行强制类型转换,并且转换为Point型。VB.NET中使用CType函数进行自定义类型转换,VC#.NET中则进行强类型转换。

【VB.NET】

code.vb.net
Dim p1 As New Point(10, 10)
Dim p2 As Object = p1
text-blue-400">Console.text-blue-400">WriteLine("x={0},y={1}",CType(p2,Point).X,CType(p2,P(int),Y)

【VC#.NET】

code.vc#.net
Point p1=new Point(10, 10);
object p2= new object();
p2=p1;
Console.WriteLine("x={0}.y={1}",((Point)(p2).X,((Point)(p2).Y);

变量

这里主要讲两个问题,一个是变量的声明,另一个是变量的作用范围。VB.NET与VB 6.0不同,可以采用下面的形式声明变量:

code.vb.net
Dim a,b,c As Single,d As Double

即同一类型的变量可以用逗号间隔,连续输入变量名。不同类型的变量也可以在一行中进行声明。上面的变量在VC#.NET中做如下声明:

code.vc#.net
float a, b, c;
double d;

在VB.NET和VC#.NET中,变量的作用范围可以局限于块,如For循环块或者If块等。在块外使用该变量时,需要重新进行声明。如下面的代码段中,在For循环中声明了一个单精度型的xx变量,利用它进行求和计算。该变量只在For循环内部有效,在外部使用它时会报错,认为它是一个没有声明的变量。

【VB.NET】]

code.vb.net
Dim sum As Single, i.As Integer
For i=0 To 9
    Dim xx As Single=10+i
    sum+=XX
Next
sum+=XX

【VC#.NET】

code.vc#.net
float sum;
for(inti=0.i<=9;i++)
{
    float xx=10+i;
    sum+=xx;
}
sum+=xx;

数组

.NET中,数组的索引值是从0开始的,而且必须从0开始。因为基数固定,所以声明数组时可以直接像下面这样声明:

【VB.NET】

code.vb.net
Dim Value(9) As Single

【VC#.NET】

code.vc#.net
float[] Value;

使用New(new)关键字创建数组,如下所示:

【VB.NET】

code.vb.net
Dim Value() As Single = New Single()

【VC#.NET】

code.vc#.net
float[] Value=new float[3]

在创建数组的同时,可以对数组进行初始化。如下所示,将数组元素的初始化值用大括号括起来,然后直接放在创建数组的代码后面就行了。对数组进行初始化是一个好的编程习惯。

【VB.NET】

code.vb.net
Dim Value() As Single = New Single() {2,4,7}

【VC#.NET】

code.vc#.net
float[] Value=new float[10]{2,4,7};

数组还有一些高级特性,后面讲述过程的参数传递时将会讲到,过程函数可以传回一个数组。

过程

.NET中的过程与某些语言中的过程的一个很明显的不同就在于,缺省时它的参数是按值传递的,而其他语言如VB 6.0是按地址进行传递的。VB.NET和VC#.NET中的过程一般具有下面的形式。注意,现在函数使用Return(retum)语句返回值。

【VB.NET】

code.vb.net
Private Sub Proc(ByVal x As Single, ByVal y As Single)
     '功能代码,比如y=x*x
End Sub
Private Function Func(ByVal x As Single,ByVal y As Single) As Single
     Dim aVal As Single
     '功能代码
     Return aVal
End Function

【VC#.NET】

code.vc#.net
private void Proc(float x, float y)
{
     //功能代码比如y=x*x;
}
private float Func(float x, float y)
{
     float aVal;
     //
     //功能代码
     //
     return aVal;
}

按值传递参数和按地址传递参数的一个主要区别是,按值传递参数不改变参数在调用过程中的值,而按地址传递参数时要改变。比如,现在要调用上面的Proc过程,要利用它返回一个y值,y值是x的平方。在调用函数中首先声明一个a变量,并赋初值0。然后给定x参数的值,调用Proc过程,要求返回y参数的值并输出到输出窗口中.即:

【VB.NET】

code.vb.net
Private Sub CallProc
     Dim a As Single =0
     Proc(10, a)
     text-blue-400">Console.text-blue-400">WriteLine(a)
End Sub

【VC#.NET】

code.vc#.net
private float CallProc()
{
     float a=0;
     Proc(10,a);
     Console.WriteLine(a);
}

按照前面的意图,我们希望得到的值是10的平方,即100,但实际上得到的是0,是a的初值。因为a参数是按值传递的,在CallProc过程中,它的值不会因为调用Proc过程而改变。下面把传值方式改为传址方式就可以解决问题。

VB.NET中声明使用传值方式时, 使用ByVal关键字使用传址方式时,使用ByRe 关键字。VC#.NET中使用传值方式时不使用关键字,使用传址方式时使用的是ref关键字。需要说明的是,在VC#NET中使用传址方式时,还要在调用过程中声明ref关键字。在VC#.NET中,传回数组参数使用的是out关键字,也需要在调用过程中声明它。另外,使用数组的高级特性还可以返回一个数组。可以参见下面的例子。

下面的例子演示了上面所介绍的几种参数传递方法,可以对照上面的文字进行体会。

【VB.NET】

code.vb.net
Private Sub Form1_Load(ByVal sender As System.Object,_
          ByVal text-blue-400">e As System.EventArgs) Handles MyBase.Load
     Dim c As Single
     Sum(10,20,c)"
     text-blue-400">Console.text-blue-400">WriteLine(c)
     Dim cpt(1) As Single
     Compute(10, 20,cpt)
     text-blue-400">Console.text-blue-400">WriteLine(cpt(0) &"," & cpt(1))
     Dim cpt2(1) As Single
     cpt2=Compute(50,20
     text-blue-400">Console.text-blue-400">WriteLine(cpt2(0) & "," & cpt2(1))
End Sub
Private Sub Sum(ByVal a As Single, ByVal b As Single, ByRef c As Single)
     c=a+b
End Sub
Private Sud Compute(ByVal a As Single, ByVal b As Single, ByRef cpt As Single())
     cpt(0) =a+b
     cpt(1)=a-b
End Sub
Private Function Compute(ByVal a As Single, ByVal b As Single) As Single()
     Dim cpt(1) As Single
     cpt(0) =a+b
     cpt(1)=a-b
     Return cpt
End Function

【VC#.NET】

code.vc#.net
private void Form1_Load(object sender, System.EventArgs e)
{
     float c=0;
     Sum(10,20,ref c);
     Console.WriteLine(c);
     float[] cpt={0,0};
     Compute(10,20,out cpt);
     Console.WriteLine(cpt[0]+","+cp[1]);
     floatl] cpt2;
     cpt2=Compute(50,20);
     Console.WriteLine(cpt2[0]+","+cpt2[1]);
}
private void Sum(float a, float b,ref float c)
{
     c=a+b;
}
private void Compute(float a,float b,out float[] cpt)
{
     cpt=new float[2];
     cpt[0]=a+b;
     cpt[1]=a-b;
}
private float[] Compute(float a, float b)
{
     float cpt0,cpt1;
     cpt0 =a+b;
     cptl=a-b;
     float[] pt={cpt0,cpt1};
     return cpt;
}

程序运行结果如图1-5所示。

Document Image
\[\]

图1-5参数传递演示