The C# Programming Language Notes II

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<!--[if gte mso 9]><![endif]--> 节)可编写在正常执行和异常情况下都将执行的终止代码。在 C++ 中,很难在不重复代码的情况下编写这样的代码"--这个有点自吹自擂了,C++的析构函数是最好的finally块,这个说了很多遍了,不说了

9,析构函数的异常

特别值得注意的是在析构函数执行过程中发生的异常。如果在析构函数执行过程中发生异常且该异常未被捕获,则将终止该析构函数的执行,并调用它的基类的析构函数(如果有)。如果没有基类(如 object 类型中的情况),或者如果没有基类析构函数,则该异常将被忽略

10 泛型

不同于C++大部分实现的编译时展开(膨胀)和Java的编译时擦拭,.Net反而是运行时展开(膨胀),造成的影响有:

  • 泛型类声明中的静态变量在相同封闭构造类型(第 20.5.2<!--[if gte mso 9]><![endif]--> 节)的所有实例之间共享,但是不会在不同封闭构造类型的实例之间共享(与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的简化形式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值