委托
1.委托将方法调用者和目标方法动态关联起来。
代理类型定义了代理实例可调用的方法。具体的,他定义了方法的返回类型和参数。定义一个代理类型Transformer:
Delegate int Transformer(int x);
Transformer兼容任何返回类型为int且有一个int类型参数的方法。将方法赋值给一个代理变量可以创建一个代理实例。
委托实际上是调用者的代表:调用者先调用委托,然后委托调用目标方法。这种间接调用方式可以将调用者和目标方法分开。
Transformer t=Square;是语句Transformer t=new Transformer(Square);的简写。
2.用委托写插入式方法
委托变量动态指定调用的方法。这个特性对于编写插入式方法非常有用的。本例有一个名为Transform的公共方法,他对整形数组的每个元素进行变换,为了指定插入式变换,Transform方法定义了一个委托。
public delegate int Transformer(int x);
public class Util
{
public static void Transform(int[] value, Transformer t)
{
for (int i = 0; i < value.Length; i++)
{
value[i] = t(value[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
int[] values = { 1, 2, 3, 4 };
Util.Transform(values, Square);
foreach (int i in values)
{
Console.WriteLine(i);
}
Console.ReadKey();
}
static int Square(int x)
{
return x * x;
}
}
3.多播委托
所有的委托实例都由多播能力。意思是一个委托实例不仅可以引用一个目标方法,而且可以引用一组目标方法。用运算符+=联合多个委托实例。
4.实例方法和静态方法的Target属性
当委托指向一个实例方法时,委托对象不仅需要维护到方法的引用,还需要维护到方法所属类的实例的引用。Target这个属性表示这个类实例(当委托引用静态方法时为空)。
5.Func和Action委托
6.委托和接口
能用委托解决的问题,都可以用借口解决。
在下面情形中,委托可能是比接口更好的选择:
- 接口内只定义了一个方法
- 需要多播功能
- 订阅者需要多次实现接口
7.委托的兼容性
8.泛型委托类型参数协变
事件
9.当使用委托时,会出现两个角色:广播者(发布者)和订阅者
广播者是包含委托字段的类,他决定何时调用委托广播。
订阅者是方法目标的接受者,通过在广播者的委托上调用+=和-=,决定何时开始和结束监听。一个订阅者不知道也不干涉其他订阅者。
10.事件是使这一模式正式化的语言形态。事件是只显示委托中广播/订阅子特性的结构。使用事件的主要目的是保护订阅者互不影响。
11.事件的声明非常简单,就是在委托成员的前面加上event关键字:
12.标准事件模式:
13.事件访问器:
14.事件修饰符:可以是虚拟的、重载的、抽象的、密封的,还可以是静态的。
15.Lambda表达式:是写在委托上的匿名方法。有以下的形式:(参数)=>表达式或语句块
16.明确指定Lambda参数类型 Func<int,int> sqr=(int x)-=>x*x;
17.捕获外部变量:int factor=2;Func<int,int> mul=n=>n*Factor; Lambda表达式引用外部变量成为捕获变量。捕获变量的表达式成为一个闭包。
18.捕获循环变量:
19.匿名方法:
匿名方法与Lambda表达式的区别是:
确定参数类型
表达式语法(匿名方法必须是语句块)
指定到Expression<T>时,编译成表达式树
20.写匿名方法的方法是:delegate关键字后面跟参数声明(可选),然后是方法体。
Delegate int Transformer(int x);
如下实现匿名方法:
Transformer sqr=delegate(int x){return x*x;};
异常处理
21.try…catch…finally..
22.system.Exception的关键属性:stackTrace、Message、InnerException
23.常用异常类型:
System.ArgumentException
System.ArgumentNullException
System.ArgumentOutOfRangeException
System.InvalidOperationException
System.NotSupportedException:不支持特定功能,比如只读集合应用Add方法
System.NotImplementedException:表明某个方法还没有具体实现
System.ObjectDisposedException:调用的对象被释放
NullReferenceException:当一个对象的值为空并访问他的成员时