C#学习[2]--C#3.0基础学习&与C++的一些区别

来源:互联网 发布:吉米多维奇 知乎 编辑:程序博客网 时间:2024/05/21 09:07

我用的入门书籍是Oreilly的C#3.0学习指南,书的结构不错,但是翻译的不好,非常坑爹。

 简单总结下一些C#一些表面的东西,肯定有许多地方理解的不到位,请批评指正。

 一、界面方面

1 用C#编辑的时候,提供的框架和C++有些区别。不再像C++那样写个主函数加上一些参数那样,而是以自己程序名命了一个namespace,定义了一个program的类,然后再定义一个静态void函数static void main()

 

二、 类型和函数方面

2 函数方面最明显的一个区别是打印和输入函数,cout  替换为了console.read()和console.write/writeline  和C语言的printf有些像。打印函数里面用了花括号的占位符,取代了C语言的%s %d这些,打印显示的时候无需设定占位符的类型。

 3 函数的定义方面,可以进行弱类型样子的定义var a=4; 然后具体的变量类型由赋值变量的类型决定。

4 类型转换方面,由于C#是一种类型安全的语言,所以一些可能造成数据丢失的隐式转换操作是会报错的,如果一定要进行,那么就只能采取显式强制转换的方式进行。

5 数据类型,数据分为两种类型,引用类型和值类型,其中int,char 这些常见的值是值类型,就是常量,无法进行修改。而对象这些是引用类型。值类型放在内存里,引用类型放在堆里面。而且值得一提的是,C#将数组也作为了对象的一种,他也是引用类型存放在堆里面,是比list这些泛型集合能力弱一些的集合。

  引用类型和值类型的一个不同在于,引用类型通过=赋值操作,就相当于创建另一个引用,所只的是一个物体,而值类型的变量通过赋值操作,只是进行了拷贝,他们实际上是两个物体,指向两块内存。(当然如果编译器有优化,也可能指向同一块内存。)

10 对象或者变量,如果不使用了,系统可以自动回收这些垃圾资源。如果需要自己进行内存的释放操作,也可以进行,但是调用的时候要声明不再使用系统自动回收操作了。

 

三、控制流

6 循环和控制流方面,多了foreach循环,这个和php这些脚本语言里面的foreach循环效果是差不多的。

7 同样因为是类型安全语言,所以执行一些有风险的操作的时候,会有try throw catch这些操作,从而防止因为异常而导致主程序中断。

8 C#的switch-case语句,可以通过goto这些实现跳转和贯穿等操作。 

8.5  对于switch语句,C#中default后面是必须要写语句话的,不能直接break;结束,但是C++可以啥都不写就过去了

 

四、类

9 类的匿名构造,一些类如果只是用一下就不再使用了,可以使用匿名类进行赋值等操作,但是这个类没有方法,而且是只读的。

11 私有变量, 类中的私有变量通过建立get和set两个访问器方法(书上科学的叫两个类的属性),可以进行访问和修改了。这个机制,对外来讲像采取了新的变量(好像把私有变量变成公有变量了),而对内来讲,其实是采取了一种新的类的方法实现的。

12 引用传递参数,不仅在调用函数声明处需要加上ref(C++是&),而且在实际使用的时候也要加上ref标记,比如func(ref x,ref y);

13 数组方面,数组增添了一些新的功能,比如交错数组(可以储存长度不等的一维数组,从而形成二维数组)当然实现要规定要进来的一维数组有多少个,以及最长的是多少。 通过函数声明将未知大小的数组添加进来,方面动态存储数据 只需要这样 void func(params int [] array)。另外,数组自己具备了clear copy sort等功能(果然成了对象就是不一样。。。)但是还是无法根据存入的数据多少,自己增加存储空间(这也是和list最大的区别)

14 C++的类允许一个类继承多个基类的属性,C#里面是不可以的。另外,派生类如果要重写基类函数实现多态的话,可以通过和之前一样让基类声明虚函数的方法进行,同时也可以在重写的时候多加一个new关键字,以此掩盖掉基类同名函数,但是后一种方面不可取,隐藏了基类信息,书上不提倡。 其实虚方法和抽象类这些概念基本和C++一样,但是在重写的时候需要注意加上override关键字。

15 接口,我不知道C++深入里面有没有接口这个概念,但是我自己是第一次在C#的教材上才看到有具体将接口的,个人觉得接口和抽象类设计的目的大致相同,只不过接口更加广泛,所有类都可以用一些常见的接口,比如比较大小,读写这些接口,而抽象类更多是一个类里面的概念,同一个类里面才有可能出现派生这些,所有个人认为它更加局域一些。另外,接口更加简洁,而且通用性更强。不同的是抽象类有一个函数是抽象的,就叫抽象类,子类如果要不做抽象类,只把基类抽象的部分实例化就好了。 而接口的话,类可以不用实现或者实现一个甚至多个接口。另外,虽然C#不允许一个类继承多个类的属性,但是可以实现多个接口。

16 泛型和集合,这些C++STl中里面应该也有类似的容器,思路应该是一样的。

 

五、其他

其他的ADO.NET、WFP、LINQ这些应该都是C#自己新加的,我觉得看起来功能都挺强大的。

 

 

 

 

 

 

 

原创粉丝点击