c# 2.0 的表达能力已经在我们的项目中得到检验,先看看1.1时哪些问题没弄明白:
q: 4,@ 取消转义
取消字符串转义尚可理解,不过连关键字都变成普通标识了,实在看不出有多大意义
a: 与其他编程语言建立接口时很有用
.net多语言平台, foreach 在c++中不是关键字,可以作为函数名称,那么导入到c#程序中就是 @foreach
q: 13,属性权限
get/set好像不能设置不同的权限,比如,我想internal set,而public get,不知怎么弄
a: 现在可以了
public string name{
get { return name; }
internal set { name = value; }
}
q: 16,new virtual有没有意义?
a: 显式的new,virtual,override声明和隐藏规则,都旨在消除版本演化的影响,使语义不会随着父类增删方法,改变方法修饰符而变化 (”new virtual”, “abstract override”属于c#的新发明)
新写一点笔记:
1,prefer using to finally, workaround for gc + dtor
using 语句
|
static void main() {
using (textwriter w = file.createtext(“test.txt”)) { w.writeline(“line one”); w.writeline(“line two”); w.writeline(“line three”); } } |
2,委托
“委托的一个有趣且有用的属性在于,它不知道也不关心它所引用的方法的类;它所关心的仅是所引用的方法与委托具有相同的参数和返回类型”--函数式编程风格在面向对象语言中的完美融合 ,配之以2.0引入的匿名方法,即模拟的lambda,匿名方法可隐式转换为与之兼容的委托类型;3.0将引入真正的lambda
3,attribute: pointcut在代码中的手工配置
4,用户定义类型转换:mapper design pattern在语言层面的支持
5, 嵌套类型
常量或类型声明会隐式地声明静态成员,即区别于java,c#所有嵌套类型都是静态的,嵌套类型和包含它的那个类型并不具有特殊的关系,但可以访问包含它的那个类型可访问的所有成员,包括private,即类似c++的friend
6,数组协变
数组协变不能扩展 value-type 的数组。例如,不存在允许将 int[] 当作 object[] 来处理的转换
7,重写显式接口成员实现
由于显式接口成员实现不能被声明为虚的,因此不可能重写显式接口成员实现。然而,有很多种方法可以绕过此限制,比如:
-
显式接口成员实现的内部完全可以调用另一个方法,只要将该方法声明为虚方法,派生类就可以重写它了
-
一个类若继承了某个接口的实现,则只要将该接口列入它的基类列表中,就可以重新实现 (re-implement) 该接口
8,finally
“在 c# 中,利用 finally 块(第 8.10 节)可编写在正常执行和异常情况下都将执行的终止代码。在 c++ 中,很难在不重复代码的情况下编写这样的代码”--这个有点自吹自擂了,c++的析构函数是最好的finally块,这个说了很多遍了,不说了
9,析构函数的异常
特别值得注意的是在析构函数执行过程中发生的异常。如果在析构函数执行过程中发生异常且该异常未被捕获,则将终止该析构函数的执行,并调用它的基类的析构函数(如果有)。如果没有基类(如 object 类型中的情况),或者如果没有基类析构函数,则该异常将被忽略
10 泛型
不同于c++大部分实现的编译时展开(膨胀)和java的编译时擦拭,.net反而是运行时展开(膨胀),造成的影响有:
-
泛型类声明中的静态变量在相同封闭构造类型(第 20.5.2 节)的所有实例之间共享,但是不会在不同封闭构造类型的实例之间共享(与c++相同,与java不同)
-
泛型和非泛型同名类可以共存(queue, queue<t>),避免流血分裂(java则是通过擦拭法来避免)
11 迭代器
正成为主流编程语言的标配,java保持沉默,c++还只是通过标准库来支持,python和c#则提供语法级别的支持
12 可空类型
原以为是null object design pattern在语言级别的支持,当发现“当 hasvalue 为 false 时,尝试访问 value 属性将引发异常”就知道不是那么回事了,实际上null object确实不容易统一实现,dynamic proxy有可能是潜在手段之一,不过c#的可空类型有点像专门为数据库访问做的优化;为了这个特定领域,引入专门的语言扩展,特定api的简便不知道能不能值回复杂性的增加;其实完全可以通过类库的形式来实现可空类型:nullable<t>,为它定义到 t 的隐式转换运算符和其它必要的设施即可,实际情况也差不多如此:int? 之类的声明是system.nullable<int>的简写,而 a ?? b更是 a == null ? b : a的简化形式