前两天为了做一个项目,很努力的把Beginning C# Objects看完了,对C#的大概语法也有一点点的了解,so,最近开始看传说中很有名的Professional C# 2005(和Primer差不多大的砖头…看上去好像还要厚一些…),刚刚看完第三章—对象和类型,其实C#和C++还是有一定的类似的,所以看起来不痛苦,但是还是有一些不同的地方和新的特性。
1、 传递参数的方式:值传递,ref传递与out传递
值传递:当在参数前面没有任何修饰符的时候所有的参数都是通过值传递来进行的,这个和C++是类似的。
Ref传递:当要改变实参的值时,C++是采用指针的方式,而C#是用ref [type] para这样的形式,需要注意的是在调用函数的时候也要加上ref args
Out传递:C#中如果没有对传递给方法的参数进行初始化,那么是不允许在函数体里改变其值的,然后如果仅仅是想用函数输出多个值,而又不愿意初始化,那么可以采用out传递,具体的与ref相同。
2、 方法的重载
重载方法是一个很好的技术,重载时只能由参数数量,类型不同来区别,这点C#和C++是一样的,然后C#多了两个关键字ref和out,是不是可以用这个来区分两个重载函数呢?答案是否定的
3、 Property
个人很欣赏这个特性,这样就不用特意写一对Set和Get函数来保证对类的数据成员的合法访问了,而且代码看上去更加intuitive。
4、 构造函数
构造函数方面,C#有一个很有意思的特例:如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数,只有在没有定义任何形式的构造函数时,编译器才会自动提供。这与C++不同,C++是只要程序员没有提供默认构造函数,那么编译就会为你提供。
提供用private/protected定义的构造函数有两个目的:a)类仅用作某些静态成员或属性的容器,因此永远不会实例化。b)希望类仅通过调用某个静态成员函数来实例化(这就是所谓对象实例化的类代理)
C#还提供一种比较新颖的构造函数类型:静态构造函数。这种构造函数只执行一次。定义方式:static ClassName(){// initialization code}。注意,无参数的实例构造函数可以在类中与静态构造函数安全共存,并不会因为他们的方法签名相同而出现编译错误。但是,.NET运行库并没有确保静态构造函数什么时候执行,所以不要把代码放在某个特定的时刻(例如,加载程序集时)执行。也不能预计不同类的静态构造函数按照什么执行,但是,可以确保静态构造函数至多运行一次,即在代码引用类之前执行。
最后,是类似C++的构造函数初始化符,即constructor() : 中的这个冒号。除了语法类似之外,C#初始化符所包含的代码遵循完全不同的规则。可以使用C++初始化列表指定成员变量的寝值,或调用基类构造函数,而C#初始化符中的代码只能调用另一个构造函数,这就要求C#类在构造时遵循严格的顺序。
5、 只读字段
C#提供一个readonly关键字,它比const灵活得多。const指定的变量的初始值必须是编译时能够确定的,然而readonly则没有这个要求。但是其规则是只能在构造函数中给只读字段赋值。如果没有赋值,那么它的值就是数据类型的默认值。这适用于静态与实例只读字段。
6、 C#中的结构和C++的结构完全不是一个概念,在C++中,struct和class是一个概念,只是关键字不同,而为了让C程序员能够适应而遗留下来的,然后C#中,结构是值类型,在栈上分配,而类是引用类型,在堆上分配。结构的生存期的限制与简单的数据类型类似,不支持继承,编译器总是为结构提供一个无参数的默认构造函数,不允许替换,可以指定字段如何在内存中布局。
结构可以用new来新生成一个对象,也可以像普通值变量那样赋值。

最近评论