[毕业生的商业软件开发之路]C#进阶建议

近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些初入职场,徘徊在牛A和牛C之间但就没找到牛B的学生们一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开始职场生涯,人生来一个完美的转弯。
------------------------------------------------------------
 

C#进阶建议

由于一些读者已经掌握了其他编程语言的技术,在此对此类读者提供一些C#进阶建议,希望能帮助这类读者更好的掌握C#语言。

从VB到C#

笔者就是从VB6.0转变到C#的,在此提出一些VB转变到C#的建议,希望能给那些已经掌握VB的读者一些帮助。

C#的语法采用C语言样式,而且其设计大量参考了VB的思想。其转变要点如下:

●VB的变量、方法和类型的名称是不区分大小写的,而C#是区分大小写的。

●VB的语句是使用换行来确定的,而C#是用过双引号“;”来分隔语法单位的。

●VB进行复合条件判断时,是所有的条件项目都会执行判断,而C#是依次执行的,若遇到确定情况则立即结束判断。

例如在VB中执行语句“if value1 <> 0 or value2 = 2 then”,若判断出“value1 <> 0成立后,按理来说无论第二个条件是否成立,这个复合条件都是成立的,但在VB中程序还是会计算“valu2 = 2是否成立,当所有的条件项目判断完毕后才得出整个复合判断条件是否成立。

而在C#中执行等价的语句“if( value != 0 or value2 == 2 )”,若判断出“value1 != 0 成立,则程序认定这个复合判断条件成立,不再计算出“value2 == 2的判断条件。

从这个过程可以看出,C#在执行复合条件判断时比VB效率高。

●foreach语句。

C#支持VB中foreach语句, VB中的写法是“foreach 变量名 in 列表变量名”,而C#的写法是“foreach( 类型名称 变量名 in 列表变量名)”。

例如有一个整数数组,在VB中遍历数据组的写法是

Dim array(10as Integer
Dim item as Integer
For Each item in Array

Next

而C#的写法是

int[] array = new int[10];
foreachint item in array )

{
}

●数组下标。

VB的数组下标默认是从1开始计算的,而C#是从0开始计算的;VB的UBound函数返回的是可用下标的最大值,而C#的数组对象的Length或者Count属性返回的是数组中元素的个数,此时可用下标的最大值是要减去1的。

例如在VB使用语句“Dim Array(10) As Integer”定义一个数组,则它的元素个数是10,最小下标是1,最大下标是10

而在C#中使用语句“int[] Array = new int[10]”定义的数组,它的元素个数是10,最小下标是0,最大下标是9,而它的Length属性值为10

在VB中对于数组下标时,下标值两边是园括号,但在C#中使用方括号。例如VB代码“Array(9)”就是获得数组中第9个元素的数值,而在C#中就必须写成“Array[9]”。

●参数传递方式。

C#和VB在函数参数的传递时都有按值传递和按引用传递的区分。VB的函数参数值默认是按引用传递的,而C#的函数参数值默认是按值传递的。

例如使用VB语句“Function F1( arg as Integer )”定义的函数,等价于“Function F1( ByRef arg as Integer)”,当函数体内部修改了参数值,跳出函数后该值也发生了改变。

Function F1( arg as Integer )
   arg 
= 10
end Function

此时语句“Function F1( arg as Integer)”等价于“Function F1( byRef arg as Integer )”,若执行了以下VB代码

Dim Val as Integer
Val = 20
F1( 
Val ) 
‘执行到这里, Val变量值在函数体内部被修改为10了。

由于在VB中默认按引用传递容易留下难于察觉的错误,因此写VB代码的时候都显式的写出ByVal或ByRef的参数传递方式。

但是在C#,默认是按照值传递的。例如对于以下C#代码

void F1( int arg )
{
    arg 
= 10 ;
}

若执行了以下C#代码

int Val = 20
F1( Val )
// 执行到这里,Val变量值还是20。

在C#中,若要按引用传递则需要使用关键字“ref”来修改参数,即写成类似“void F1( ref int arg)”的代码。这样函数体内部修改参数值,函数外部就获得修改后的参数值了。

C#提供了“out”关键字来参数的传递方式提供更精细的方式,也就是写成类似“void F1( out int arg)”的代码。标记了“out”的关键字说明该参数按引用传递,而且函数体内部必须修改该参数值,否则编译错误。这也算是非正常的函数返回值吧。

对于类类型,VB和C#都是按引用传递的。

函数调用方式。

VB调用方法是就是直接写函数名,后面跟着参数,参数不用括号分开,比如定义了函数“Function F1( byval a as Integer , byval b as Integer )”,则调用该函数的代码通常为“F1 10 , 20,少数情况也可以写成“Call F1( 10 , 20 )”。但对于C#必须在参数两边写上园括号的,因此必须写成“F1( 10 , 20 )”。

●异常处理。

VB中可以使用“on error goto”或“on error resume”来处理异常,并支持使用“resume”语句来跳回到发生异常的代码处。但C#不支持类似“on error resume”语句的功能,也不支持“resume”进行代码跳转。

从C/C++到C#

笔者对C/C++语言也是略懂略懂,因此在此提出一些从C/C++语言转变到C#语言的一些参考建议,希望能对那些已经掌握了C/C++语言的读者提供些帮助。其要点如下:

●指针。

C语言最大强大的功能就是指针。C#也支持指针,但已经不推荐使用了,从而使指针成为很高级的C#语法了。

在C#语言中要使用指针,首先得使用语法结构“unsafe{ }”创建一个代码块,在这个代码块中才能使用指针。

定义指针变量时,C#中“*”必须和基础类型在一起使用,否则编译错误,比如代码“int* p1 , p2 , p3C#中定义了3个指向整数类型的指针变量;而代码“int *p1 , *p2 , *p3;”在C#中是会发生编译错误的,而在C语言中是正确的。

C#不允许不同指针类型之间或者指针类型与整数之间的转换,而C语言只允许的。比如代码

int* p1;
char*p2;
p1 
= p2;

这段代码在C#中是错误的,而在C语言中是可以的。

●安全性。

C#提供了比C/C++更为严格的安全性。比如C/C++不检查数组下标是否越界,而C#会严格检查的。.NET框架提供了可信运行环境,在此上面运行的所有的程序都要受到限制,包括C#

●条件编译。

C#也支持类似C语言的条件编译功能,支持“#define”、“#undefine”、“#if”等指令。但不支持C样式的宏,包括宏常量和带参数的宏,也不支持“#include”指令。

●访问类型成员。

在C++中使用“->”访问类型成员,而在C#中直接使用一个字符点“.”来访问类型成员。

●函数。

在C/C++中,函数是可以独立编写的,不属于任何类型,比如Main函数。但在C#中没有游离的函数,所有的函数必须属于某个类型,包括Main函数。

●字符串定义。

在C/C++中使用双引号定义一个字符串量,并且使用斜杠字符“\”进行转义,C#也支持,不过还提供一种定义多行字符串的方法,也就是在双引号前面加上“@”符号。例如以下C#代码定义了一个多行字符串。

string myStr = @“abc
1234 \t
5678”;

在C#定义的多行字符串时,斜杠转义是无效的。

特别的,在传统的C/C++中,字符串是以“\0”作为字符串的结束标志的,而在C#中字符串对象可以包含“\0”的,这点在两者之间传递字符串数据时需要注意。

●继承。

在C++中,一个类可以继承多个其他类,可以实现多个接口;而在C#中一个类只能继承一个其他的类,也可以实现多个接口。

注释。

C/C++支持双斜杠字符“//”定义单行注释,使用斜杠和星号对“/*    */”实现多行注释,C#也支持这种方式。

不过C#更进一步,在成员或者函数前面使用连续的三个斜杠“///”和特定的XML语法实现文档化的注释,C#编译器能提取出代码中的文档化的注释并自动生成相关SDK帮助文档。

从JAVA到C#

笔者对JAVA语法也是略懂略懂,真的只是略懂哦。现在以个人对JAVA语法的一点理解来提出从JAVA转到C#的建议,希望能对已经掌握了JAVA语法的读者有所帮助。

●JAVA和C#语法确实非常像,代码组织结构也很类似,双方都有相对应的关键字。

●C#支持委托,而JAVA不支持。C#中的委托可以说是C语言的函数指针的OOP版本,它是一种变量,能存储某个函数的入口点地址,因此委托可以增强C#语言的灵活性,而JAVA不支持这种特性。

●C#支持事件,而JAVA不支持。C#在委托的支持下支持事件,一个事件上可以绑定多个委托来支持广播;而且JAVA需要通过实现接口的方式来模拟实现事件机制,这方面操作起来不大方便。

posted on 2011-08-11 09:39  袁永福 电子病历,医疗信息化  阅读(1367)  评论(0编辑  收藏  举报

导航