惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
D
Docker
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Simon Willison's Weblog
Simon Willison's Weblog
S
Security Affairs
NISL@THU
NISL@THU
T
Tor Project blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
腾讯CDC
S
Schneier on Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
Latest news
Latest news
C
Check Point Blog
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
月光博客
月光博客
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs

博客园 - 许明会

异步编程,采用WorkgroupWorker,async和await关键字 OCR图像识别技术-Asprise OCR 关于委托,事件和类的设计准则 JavaScript能干什么? C#泛型代理、泛型接口、泛型类型、泛型方法 DES对称性加密 利用委托实现异步调用 通过Windows组策略限制证书组织流氓软件的安装运行 枚举\位域\结构综合实验 - 许明会 - 博客园 public static void Invoke (Action action) C#编写WIN32系统托盘程序 C#的互操作性:缓冲区、结构、指针 SQLServer异步调用,批量复制 Python体验(10)-图形界面之计算器 Python体验(09)-图形界面之Pannel和Sizer Python体验(08)-图形界面之工具栏和状态栏 Python体验(07)-图形界面之菜单 C#利用WIN32实现按键注册 Javascript猜数字游戏
Delegate, Method as Parameter.
许明会 · 2016-04-05 · via 博客园 - 许明会
  1. 代理, 将方法作为另一方法的参数. 类似C里面的函数指针.
    using System;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greeting(string name);
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
            //委托,将方法作为另一方法的参数.委托可以代表一系列返回值和参数类型与其一致的方法.
            private static void GreetingPeople(string name, Greeting greet)
            {
                greet (name);
            }
                
            public static void Main()
            {
                GreetingPeople ("Jeffrey Richter", GreetingEnglish);
                GreetingPeople ("刘德华", GreetingChinese);
                Console.ReadKey ();
            }
        }
    
    }
  2. 将方法绑定到委托
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greeting(string name);
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
            private static void GreetingFrance(string nom)
            {
                Console.WriteLine ("Bonjour,{0}", nom);
            }
            //delegate: use the Method name as Parameters.
            private static void GreetingPeople(string name, Greeting greet)
            {
                greet (name);
            }
                
            public static void Main()
            {
                GreetingPeople ("Jeffrey Richter", GreetingEnglish);
                GreetingPeople ("刘德华", GreetingChinese);
                //bind Method to Delegate
                Greeting chinese = GreetingChinese;
                Greeting english = GreetingEnglish;
                english += GreetingFrance;
                chinese ("许明会");
                english ("Matt Petrek");
                Console.ReadKey ();
            }
        }
    }
  3. 委托与接口
    using System;
    using System.Threading;
    
    namespace Demo
    {
        interface IGreeting{
            void Greeting(string name);
        };
    
        public class GreetingChinese:IGreeting
        {
            public void Greeting(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
        }    
        public class GreetingEnglish:IGreeting
        {
            public void Greeting(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
        }
        public class Demo
        {
            private static void Greeting(string name, IGreeting greeting)
            {
                greeting.Greeting (name);
            }
            public static void Main()
            {
                IGreeting chinese = new GreetingChinese ();
                IGreeting english = new GreetingEnglish ();
                chinese.Greeting ("许明会");
                english.Greeting ("Jeffrey Richter");
                Greeting ("Matt Petrik", english);
                Console.ReadKey ();
            }
        }
    }
  4. 更好的封装,事件的由来
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            public Greet deleGreet;
            public void Greeting(string name, Greet greet)
            {
                greet (name);
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
                gm.deleGreet = GreetingChinese;
                gm.deleGreet += GreetingEnglish ;
                gm.Greeting ("Matt Petrik",gm.deleGreet);
                Console.ReadKey ();
            }
        }
    }
  5. 更好的封装,准备引入事件
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            public Greet deleGreet;
    
            public void Greeting(string name)
            {
                if (deleGreet!=null) {
                    deleGreet(name);
                }
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
                gm.deleGreet = GreetingChinese;
                gm.deleGreet += GreetingEnglish ;
                gm.Greeting ("Matt Petrik");
                Console.ReadKey ();
            }
        }
    }
  6. 委托的目的是把它暴露到外面,以让客户端进行方法注册。Event保证在类的内部总是Private,可认为是为Delegate定制的Property。
    using System;
    using System.Threading;
    
    namespace Demo
    {
        public delegate void Greet(string name);
    
        public class GreetingManager
        {
            //public Greet deleGreet;
            public event Greet EventGreet;
    
            public void Greeting(string name)
            {
                if (EventGreet!=null) 
                    EventGreet(name);
            }
        }
    
        public class Demo
        {
            private static void GreetingEnglish(string name)
            {
                Console.WriteLine ("Hello,{0}", name);
            }
            private static void GreetingChinese(string name)
            {
                Console.WriteLine ("你好,{0}", name);
            }
    
            //Main()
            public static void Main()
            {
                GreetingManager gm = new GreetingManager ();
                gm.EventGreet += GreetingChinese;
                gm.EventGreet += GreetingEnglish ;
                //Greeting call from client, that's not good!
                gm.Greeting ("Matt Petrik");
                Console.ReadKey ();
            }
        }
    }
  7. .NET框架的委托和事件