果壳中的c#--学习笔记Day3

委托

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.委托和接口

能用委托解决的问题,都可以用借口解决。

在下面情形中,委托可能是比接口更好的选择:

  1. 接口内只定义了一个方法
  2. 需要多播功能
  3. 订阅者需要多次实现接口

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:当一个对象的值为空并访问他的成员时
 

猜你喜欢

转载自blog.csdn.net/weixin_39504659/article/details/86538090