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的简化形式