回过头总结了一些 C#的小细节
大纲:
1,C#基本
2,C#2.0 的泛型
3,C#3.0 的一系列语法糖
4,C#4.0 新特性
内容:
一,C# 基本
1,char与string是Unicode编码
2,C#类型分为 值类型 和 引用类型。 其中string是个讨厌的引用类型,但表现起来像值类型
3,类可包含 数据成员(字段、常量)和 函数成员(方法、属性、构造、析构、运算符、索引、事件)。类中的字段会自动初始化。
4,new不一定只在堆中为类分配内存,也可以用来为struct在栈上分配内存。比如DateTime是一个Struct,值类型。我们经常用new
5,参数的传递默认 就是 值传递,即不管值类型还是引用类型,都只传递副本,值类型的副本,和引用类型的副本,只不过引用类型的副本与原引用类型指向的是同一对象。
加上ref关键字,就变成引用传递了。6,只是返回值不同,无法函数重载,因为返回值不是方法签名的一部分。
7,在C#中,静态static的唯一含义大概就是生命周期的不同。静态类成员生命周期超出实例。const包括有static的特性
8,类中可以有析构函数,GC在清理时会调用,但不知道什么时候会调用,即没有时效性。如果类中使用了很多资源(尤其是非托管资源:数据库,文件,网络等等),最好的策略是:显示的设置Dispose方法,但为了保证有些程序员忘记主动调用这个方法,所以还是要设置析构函数。
9,所以是另一种形式的属性。单值到多值。索引可以重载。
10,get;set;加访问限制符,和 partial function 的 限制条件很多。
11,derived class 对 base class 的成员只能 重写 或者 覆盖(隐藏)。
12,覆盖:使用new关键字来显示声明我实在覆盖base class的成员,但并不意味着被覆盖的成员消失了,通过base调用还可以。
13,重写:virtual 与 override。支持连续继承时的重写。抽象函数(纯虚函数)的重写:abstract与override。
14,向上类型转换这种事就不说了。但要注意:覆盖不会引起向上类型转换,而重写可以。
15,类初始化时,应该初始化他的基类(隐式和显示=初始化列表)
16,结构可以有带参构造函数,无参构造函数已经被隐式的声明,无法替代
17,枚举的位标志,挺有用,相当于一组查询条件。
18,委托,一种函数指针的扩展,安全且具有一个相同签名相同返回类型的有序方法列表。如果列表中只有一个方法,则和函数指针很相像。
19,委托,是一种类型,很类一样。class A 与 delegate void MyDel(int x);
20,匿名方法、lambda表达式
21,事件:有点像某个函数的参数为函数指针,即程序员告诉这个函数执行那个动作,将函数指针传入,相当于注册一下。类比一下:某一类A定义事件(比如单击事件)成员,这时类B要告诉类A,当事件发生时,你应该执行哪些方法。这些方法以委托的形式赋予事件。类A叫做发布者(publisher),类B叫做订阅者(subscriber),类A中的事件成员叫做Event Member,而绑定到Event Member上的方法,叫做Event Handler。
22,从实现角度类比一下:在类中定义 private int a;再定义一属性 public int A{get;set;}。这里,事件就相当于属性A,而委托相当于a,事件对委托包装了一下,限制了其动作,只能+=与-=。
23,实现枚举的几种方法:实现IEnumerator或者IEnumerator<T>;实现IEnumerable或者IEnumerable<T>;只实现特定方法,不实现接口(提升性能)。建议使用泛型的接口
23,IEnumerator接口包含Current、MoveNext、Reset
让一个类可以用foreach,实现方式如下:
第一种:
其中,“关于Enumeration的东西“内容为:
第二种:
当然,我还是十分怀疑foreach的效率。
二,C#2.0 泛型
1,标准事件委托EventHandler的泛化,EventHandler<MyEventArgs>
2,可空类型
三,C#3.0 语法糖
1,var变量是虚假的,最好不要用。
2,扩展方法
3,外部方法
4,lambda表达式
5,Linq
四,C#4.0 新特性