精华内容
参与话题
问答
  • 22. Delegates

    2006-06-22 03:18:00
    [Note: Delegates enable scenarios that other languages?such as C++, Pascal, and Modula?have addressed withfunction pointers. Unlike C++ function pointers, however, delegates are fully object oriented,
    [Note: Delegates enable scenarios that other languages?such as C++, Pascal, 
    and Modula?have addressed with
    function pointers. Unlike C++ function pointers, however, delegates are
    fully object oriented, and unlike
    C++ pointers to member functions, delegates encapsulate both an object
    instance and a method. end note]
    A delegate declaration defines a class that is derived from the class
    System.Delegate. A delegate instance
    encapsulates one or more methods, each of which is referred to as a
    callable entity. For instance methods, a
    callable entity consists of an instance and a method on that instance. For
    static methods, a callable entity consists
    of just a method. Given a delegate instance and an appropriate set of
    arguments, one can invoke all of that
    delegate instance?s methods with that set of arguments.
    [Note: An interesting and useful property of a delegate instance is that it
    does not know or care about the classes
    of the methods it encapsulates; all that matters is that those methods be
    compatible (§22.1) with the delegate?s
    type. This makes delegates perfectly suited for ?anonymous? invocation. end
    note]
    展开全文
  • delegates 基本用法就是将内部对象的变量或者函数绑定在暴露在外层的变量上,直接通过 delegates 方法进行如下委托,基本的委托方式包含: getter:外部对象可以直接访问内部对象的值 setter:外部对象可以直接修改...

    delegates 基本用法就是将内部对象的变量或者函数绑定在暴露在外层的变量上,直接通过 delegates 方法进行如下委托,基本的委托方式包含:

    getter:外部对象可以直接访问内部对象的值
    setter:外部对象可以直接修改内部对象的值
    access:包含 getter 与 setter 的功能
    method:外部对象可以直接调用内部对象的函数

    const delegates = require('./index');
    
    const petShop = {
      dog: {
        name: '旺财',
        age: 1,
        sex: '猛汉',
        bar() {
          console.log('bar!');
        }
      },
    }
    
    // 将内部对象 dog 的属性、函数
    // 委托至暴露在外的 petShop 上
    delegates(petShop, 'dog')
      .getter('name')
      .setter('age')
      .access('sex')
      .method('bar');
    
    // 访问内部对象属性
    console.log(petShop.name)
    // => '旺财'
    
    // 修改内部对象属性
    petShop.age = 2;
    console.log(petShop.dog.age)
    // => 2
    
    // 同时访问和修改内部对象属性
    console.log(petShop.sex)
    // => '猛汉'
    petShop.sex = '公主';
    console.log(petShop.sex);
    // => '公主'
    
    // 调用内部对象函数
    petShop.bar();
    // 'bar!'
    
    展开全文
  • 摘要 委托是C#编程一个非常重要的概念,也是一个难点。本文将系统详细讲解委托。   1. 委托是什么? ...其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的...

    摘要

    委托是C#编程一个非常重要的概念,也是一个难点。本文将系统详细讲解委托。

     

    1. 委托是什么?

    其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解:

     (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型

     (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。

    既然委托是一种类型,那么它存储的是什么数据?

    我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

     

    2. 委托类型的定义

    委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

    delegate void MyDel(int x);

    委托类型声明:

    (1) 以deleagate关键字开头。

    (2)返回类型+委托类型名+参数列表。

     

    3. 声明委托变量

    MyDel del1,del2;

     

    4. 初始化委托变量

    (1) 使用new运算符

    new运算符的操作数的组成如下:

    • 委托类型名
    • 一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以是实例方法或静态方法。
    del1 = new MyDel( myInstObj.MyM1 );
    del2 = new MyDel( SClass.OtherM2 );

    (2)使用快捷语法

    快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称和其相应的委托类型之间有隐式转换。

    del1 = myInstObj.MyM1;
    del2 = SClass.OtherM2;

     

    5. 赋值委托

     由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

    MyDel del;
    del = myInstaObj.MyM1; //委托初始化
    del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收

     

    6. 组合委托

     委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

    委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本

    MyDel del1 = myObj.MyMethod;
    MyDel del2 = SClass.OtherM2;
    MyDel del3 = del1 + del2;   //组合调用列表

     

    7. 委托加减运算

    可以使用+=运算符,为委托新增方法。

    同样可以使用-=运算符,为委托移除方法。

    MyDel del = myObj.MyMethod;
    del += SClass.OtherM2; // 增加方法
    del -= myObj.MyMethod; // 移除方法

     

    8. 委托调用

    委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

    在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

    if(null != del)
    {
         del();//委托调用
    }

     

    9. 匿名方法

    匿名方法是在初始化委托时内联声明的方法。

    基本结构:

    deleage( 参数 ) { 语句块 }

    例如:

    
    
    delegate int MyDel (int x); //定义一个委托 

    MyDel del = delegate( int x){ return x; };

    从上面我们可以看到,匿名方法是不会显示声明返回值的

     

    10. Lambda表达式

    Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

    • 删除delegate关键字
    • 在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。
    MyDel del = delegate( int x) { return x; };//匿名方法
    MyDel del2 = (int x) => {return x;};//Lambda表达式
    MyDel del3 = x => {return x};//简写的Lambda表达式

     

    展开全文
  • c#委托(Delegates)--基本概念及使用

    万次阅读 多人点赞 2018-05-13 00:10:56
    在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复。最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用。嗯...本人以前并没有用过,只是稍微知道而已。...


       在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复。最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用。嗯...本人以前并没有用过,只是稍微知道而已。以下是整理的笔记。

    一.委托的概念

        委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。

    二.委托类型的定义

    委托类型必须在被用来创建变量以及类型对象之前声明。

    委托类型的声明:

    1.以delegate关键字开头。

    2.返回类型+委托类型名+参数列表

    delegate void MyDel(int a)

    三.实例

    1)现在我们先创建了控制台程序,进行简单的实例

    namespace Func
    {
        public delegate void MyDel();//声明一个自定义委托
        class Program
        {
            static void Main(string[] args)
            {
                MyDel say1 = SayHi;
                MyDel say2 = new MyDel(SayHi);
                say1();
                say2();
            }
            static void SayHi()
            {
                Console.WriteLine("hi");
            }
        }
    }

    2)扩展实例

    namespace Func
    {
        public delegate int MyDel(int num);//声明一个自定义委托
        class Program
        {
            static int Add1(int a)
            {
                int b = 10 + a;
                Console.WriteLine("——Add1———");
                return b;
    
            }
    
            static int Add2(int a)
            {
                int b = 10 - a;
                Console.WriteLine("——Add2———");
                return b;
    
            }
    
            static void Calculate(MyDel ex, int a)
            {
                var result = ex(a);
                Console.WriteLine(result + "\n");
            }
    
            static void Main(string[] args)
            {
                Calculate(Add1, 1);
                Calculate(Add2, 10);
                Console.ReadKey();
            }
        }
    }

    结果如下图


    上面实现了把方法当作参数在另一个方法中传递或调用”;从上面可以看出,调用的方法和委托的返回类型,参数类型都必须一致。

    我们可以把委托作为参数传递给封装好了的方法,通过委托来动态的调用方法。


    四.委托的加减运算

    可以使用+=运算符,为委托新增方法。

    同样可以使用-=运算符,为委托移除方法。

    当委托列表中有几个方法时,调用委托时,则会依次经过各个方法,并返回列表最后一项方法的结果。

    namespace Func
    {
        public delegate int MyDel(int num);//声明一个自定义委托
        class Program
        {
    
            static int Add1(int a)
            {
                int b = 10 + a;
                Console.WriteLine("——Add1———");
                return b;
    
            }
    
            static int Add2(int a)
            {
                int b = 10 - a;
                Console.WriteLine("——Add2———");
                return b;
    
            }
    
            static void Calculate(MyDel ex, int a)
            {
                var result = ex(a);
                Console.WriteLine(result + "\n");
            }
    
            static void Main(string[] args)
            {
                //Calculate(Add1, 1);
                //Calculate(Add2, 10);
                MyDel myDel = Add1;
                myDel += Add2;
                Calculate(myDel, 10);
                Console.ReadKey();
            }
        }
    }

    结果如下图:



    那么有时候我们需要返回每个方法的结果,此方法就不适用了,那怎么才能实现每个方法的返回结果都可以获取到呢?后续再写了。今天就简单的介绍了委托的基本概念和使用。


    展开全文
  • Delegates之前,首先必须了解下kotlin的委托机制,这个委托机制还是很不错的,可以将一个对象的构造和设置值,都给委托给其它 委托机制 关键词by,是不是很眼熟,这不是我们经常用过的by lazy{} ,没错懒加载就是用...
  • Delegates.notNull() (api reference) is based on delegated properties and was the original, and later came lateinit (Late Initialized Properties). Neither cover all possible use cases and neither shou...
  • QT代理Delegates使用实例

    千次阅读 2012-03-15 10:49:23
    效果如下,在表格的单元格中插入控件,用Delegates方式实现  源代码如下: main.cpp文件 #include #include #include #include #include #include "datedelegate.h" ...
  • ylbtech-Unitity-CS:Delegates

    2015-12-20 22:40:00
    ylbtech-Unitity-CS:Delegates   1.A,效果图返回顶部   Invoking delegate a: Hello, A! Invoking delegate b: Goodbye, B! Invoking delegate c: Hello, C! Goodbye, C! In....
  • IntroductionIn this article I am going to describe some confusing terms including Func, Action, Predicate, lambda expression and delegate and their differences. Although the introduction ...
  • Delegates and Events

    2014-03-23 07:05:00
    People often find it difficult to see the difference between events and delegates. C# doesn't help matters by allowing you to declare field-like events which are automatically backed by a delegate ...
  • delegates模块是由TJ大神写的,该模块的作用是将内部对象上的变量或函数委托到外部对象上。然后我们就可以使用外部对象就能获取内部对象上的变量或函数。delegates委托方式有如下: getter: 外部对象可以通过该方法...
  • The two models are similar, and one predates the ... Delegates.notNull() (api reference) is based on delegated properties and was the original, and later came lateinit (Late Initialized Properties)...
  • Java delegates

    2008-09-12 12:06:00
    Java Delegatessource: http://www.cutthecrap.biz/software/delegates.html Delegates are a useful construct in event-based systems. Essentially Delegates are objects that encode a method dispatch o
  • node-delegates 是 TJ 大神所写的一个简单的小工具,源码只有 157 行,作用在于将外部对象接受到的操作委托到内部属性进行处理,也可以理解为讲对象的内部属性暴露到外部,简化我们所需要书写的代码。 安装和使用的...
  • Events and Delegates(事件和委托)

    千次阅读 2015-08-22 17:08:23
    Introduction One of the most interesting concepts in C# is Event-Driven approach. Though it is a simple technique, this article is here for beginners and those who are struggling to understand the ...
  • C# Delegates 委托

    2019-11-22 23:42:47
    C# Delegates 委托 通常我们都是把数据作为参数传递给方法:int i = int.Parse(“99”);当需要把方法传送给其他方法时就需要使用委托。 类的用法,首先声明一个类,接着实例化一个类,委托的用法和类的用法类似,...
  • .NET Delegates: A C# Bedtime Story.NET委托:一个C#睡前故事Tight Coupling紧耦合 Once upon a time, in a strange land south of here, there was a workernamed Peter. He was a diligent wor
  • 对于像我这样的初学者来说,每次看书看到Event和Delegate的时候,就头脑发昏.往往会跳过这些章节,去阅读其他的章节,因为读这些章节需要很大的勇气,看不懂,太打击自己的学习兴趣.之前已经却步了很多次了....
  • 系列文章: 每天阅读一个 npm 模块(1)- username 每天阅读一个 npm 模块(2)- mem 每天阅读一个 npm 模块(3)- mimic-fn 每天阅读一个 npm 模块(4)- throttle-debounce 每天阅读一个 npm 模块(5)- ee-first...
  • delegates,可以帮我们方便快捷地使用设计模式当中的委托模式(Delegation Pattern),即外层暴露的对象将请求委托给内部的其他对象进行处理。 用法 delegates 基本用法就是将内部对象的变量或者函数绑定在暴露在...

空空如也

1 2 3 4 5 ... 20
收藏数 16,527
精华内容 6,610
关键字:

delegates