zoukankan      html  css  js  c++  java
  • 十二、事件,委托,泛型委托,集合(泛型和非泛型),Lambda表达式(声明委托,使用委托,简单的委托示例,action<T>和func<t>委托,多播委托,匿名方法,Lambda表达式,参数,事件)

    事件(Event)

    事件是一种对象或类能够提供通知的成员,客户端可以通过提供事件处理程序为相应的事件可添加可执行代码,事件可以理解为一种特殊的委托。

    委托(Delegate)

    委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。C#中的委托类似于C、C++中的函数指针。

    委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

    //委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。
    using System;
    
    delegate int NumberChanger(int n);
    namespace DelegateAppl
    {
       class TestDelegate
       {
          static int num = 10;
          public static int AddNum(int p)
          {
             num += p;
             return num;
          }
    
          public static int MultNum(int q)
          {
             num *= q;
             return num;
          }
          public static int getNum()
          {
             return num;
          }
    
          static void Main(string[] args)
          {
             // 创建委托实例
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             // 使用委托对象调用方法
             nc1(25);
             Console.WriteLine("Value of Num: {0}", getNum());
             nc2(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }

    多播委托

    委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

    使用委托的这个有用的特点,可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。

    泛型(Generic)委托

    using System;
    using System.Collections.Generic;
    
    delegate T NumberChanger<T>(T n);
    namespace GenericDelegateAppl
    {
        class TestDelegate
        {
            static int num = 10;
            public static int AddNum(int p)
            {
                num += p;
                return num;
            }
    
            public static int MultNum(int q)
            {
                num *= q;
                return num;
            }
            public static int getNum()
            {
                return num;
            }
    
            static void Main(string[] args)
            {
                // 创建委托实例
                NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
                NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
                // 使用委托对象调用方法
                nc1(25);
                Console.WriteLine("Value of Num: {0}", getNum());
                nc2(5);
                Console.WriteLine("Value of Num: {0}", getNum());
                Console.ReadKey();
            }
        }
    }

    action<T>和func<t>委托

    Action<T>是没有返回值得方法委托,Func<T>是有返回值的委托。返回值的类型,由泛型中定义的类型进行约束。

    集合(Collection)

    集合(Collection)类是专门用于数据存储和检索的类。

    这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

    常用的集合类有ArrayList(非泛型集合)、List(泛型集合)、HashTable(非泛型集合)、Dictionary(泛型集合)、

    Queue(队列,代表一个先进先出的对象集合)和Stack(堆栈,代表一个后进先出的对象集合)、SortedList(泛型集合)

    匿名方法(Anonymous methods) 

    提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。

    在匿名方法中不需要指定返回类型,它是从方法主体内的 return 语句推断的。

    Lambda表达式

    Lambda表达式是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。

    它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。

    C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:

    形参列表=>函数体
    Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
     
     
  • 相关阅读:
    log4j动态添加appender
    【翻译】java里编写基准测试的一些经验
    java线程池:获取运行线程数并控制线程启动速度
    maven里的mirror和repository: 配置多repository
    使用maven shade plugin 打可执行Jar包
    activemq plugin开发指南及示例
    通过加入classpath的形式实现命令行运行java程序时引入第三方jar包
    java异常、异常处理机制
    内部类
    接口
  • 原文地址:https://www.cnblogs.com/baixiao/p/7746494.html
Copyright © 2011-2022 走看看