C# 自己对delegate的总结和认识

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace LamdaSimple
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private delegate double MathAction(double num);

        private double Double(double input)
        {
            return input * 2;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //MSDN上例子:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(DELEGATE_CSHARPKEYWORD);k(DELEGATE)&rd=true
            // Instantiate delegate with named method:委托
            MathAction ma = Double;
            // Invoke delegate ma:
            double multByTwo = ma(4.5);
            Console.WriteLine(multByTwo);

            // Instantiate delegate with anonymous method:匿名方法
            MathAction ma2 = delegate(double input)
            {
                return input * input;
            };
            double square = ma2(5);
            Console.WriteLine(square);

            // Instantiate delegate with lambda expression:Lambda表达式
            MathAction ma3 = (s) =>
            {
                return s * s;
            };

            PrintAction((s) =>
            {
                return s * s;
            });

            //**************************************************************
            //参数为:Delegate method;才可以进行new Action
            Thread t = new Thread(() => this.textBox1.Invoke(new Action(() =>
            {
                for (int i = 0; i < 50; i++)
                {
                    this.textBox1.Text = i.ToString();
                }
            })));
            t.Start();

            //**************************************************************
            //s => s + s; s=>{ return s+ s;} 相当于
            List<string> lst = new List<string>();
            var v = lst.Select(s => { return s; });
            var v1 = lst.Select(s => s + 10);

            List<Student> lstStundets = new List<Student>();
            var v2 = lstStundets.Select(s =>
            {
                return new
                {
                    aaa = s.ID,
                    bbbb = s.Name
                };
            });
            //等于
            var v3 = lstStundets.Select(s =>
            new
            {
                aaa = s.ID,
                bbbb = s.Name
            });

            //**************************************************************
            //当只有一个参数的时候
            lstStundets.ForEach(s =>
            {
                s.ID = "";
                s.Name = "";
            });

            lstStundets.ForEach((s) =>
            {
                s.ID = "";
                s.Name = "";
            });

            lstStundets.ForEach((s) =>
            {
                s.ID = "";
                s.Name = "";
            });

            try
            {
                var intValue = this.textBox1.GetValue<int>();
            }
            catch (Exception)
            {
            }
        }

        public void PrintAction(Func<double, double> ation)
        {
        }
    }

    public class Student
    {
        public string ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }

    public static class Exstions
    {
        ///默认版本,调用上个重载方法

        public static TResult GetValue<TResult>(this TextBox textBox)
                    where TResult : struct
        {
            return GetValue<TResult>(textBox, true);
        }

        public static TResult GetValue<TResult>(this TextBox textBox, bool isShowError)
            where TResult : struct
        {
            return GetValue<TResult>(textBox, (p) =>
            {
                if (isShowError)
                {
                    p.Focus();
                    p.SelectAll();
                    MessageBox.Show("输入值格式不正确,请重新输入!",
                        "提示--值类型:" + typeof(TResult).Name,
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            });
        }

        //ailed(textBox); 可以这样理解。
        //委托指向方法;相当于一个不返回值,参数为TextBox的方法。如下:
        public static void ExecutAction(TextBox textBox)
        {
            textBox.Focus();
            textBox.SelectAll();
        }

        public static TResult GetValue<TResult>(this TextBox textBox, Action<TextBox> failed)
            where TResult : struct
        {
            var type = typeof(TResult);
            var method = type.GetMethod("TryParse", new Type[] { typeof(string), type.MakeByRefType() });
            var parameters = new object[] { textBox.Text, default(TResult) };

            // 若转换失败,执行failed
            if (!(bool)method.Invoke(null, parameters))
            {
                failed(textBox);
                throw new InvalidCastException("输入值格式不正确,请检查输入值。");
            }

            return (TResult)parameters[1];
        }
    }
}

  代码下载:http://files.cnblogs.com/zfanlong1314/LamdaSimple.zip

C# 自己对delegate的总结和认识,布布扣,bubuko.com

时间: 2025-01-05 22:46:56

C# 自己对delegate的总结和认识的相关文章

代理Delegate的小应用(代理日期控件和下拉框)

前言 在平时关于表格一类的的控件使用中,不可避免需要修改每个Item的值,通过在Item中嵌入不同的控件对编辑的内容进行限定,然而在表格的Item中插入的控件始终显示,当表格中item项很多的时候,会影响表格的美观和用户的体验.此时Delegate代理就派上了用场,通过Delegate可以使得Item的控件在编辑状态才显示,提高了用户的体验满意度. 效果展示 1.展示状态: 2.编辑状态   设计思路 这类效果的实现主要使用了QItemDelegate类,QItemDelegate类为数据项It

iOS delegate, 代理/委托与协议.

之前知知道iOS协议怎么写, 以为真的跟特么java接口一样, 后来发现完全不是. 首先, 说说应用场景, 就是当你要用一个程序类, 或者说逻辑类, 去控制一个storyboard里面的label, 发现如果直接用 UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];//由storyboard根据myView的storyBoardID来

Delegate成员变量和Event的区别

上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别. 我的第一反应是没啥区别,虽然从语法看起来不一样,但从代码希望达成的效果来看是一致的,本质都是回调函数.当然区别是肯定有的,我能给我的理由是两个:首先从与COM交互操作时,event对应COM接口中的事件:其次VS的编译环境对定义event提供了更加便捷的支持,可以为其自动生成回调函数的框架. 翻了翻MSDN,并没有直接描述两

复习扩展方法 涉及委托,这里我使用自定义委托类型 public delegate bb MyFunc&lt;in T,out bb&gt; (T arg)

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication8{ public static class ListExt { public delegate bb MyFunc<in T, out bb>(T arg); public sta

ios中的代理与协议(delegate)

源码地址 :http://download.csdn.net/download/swanzhu/9016861 一.理解协议与代理 协议 协议的格式:@protocol关键字:协议的声明 例如 @protocol CustomAlertViewDelegate <NSObject> <methods>协议的方法 @optional //此关键字下声明的方法,是可选实现的方法. @required //此关键字声明的方法为,必须实现的方法,如果不实现,编译会报警告,程序运行崩溃. /

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置

一个UICollectionView有好多个cell,滑动一下,谁也不知道会停留在哪个cell,滑的快一点,就会多滑一段距离,反之则会滑的比较近,这正是UIScrollview用户体验好的地方. 如果想要UICollectionView停留到某个cell的位置,可以用 - (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPos

Delegate(委托)

在前面lambda章节中稍微提了一下委托,今天这章就让我们来深究一下委托. 委托的本质是一种类,他是继承MulticastDelegate类的. 而声明委托的关键字的delegate,如:public delegate void NoReturnNoParaOutClass(); 但是刚才也讲了委托一种类,那按照类的声明,我们应该可以这样声明一个委托. public class  NoReturnNoParaOutClass: System.MulticastDelegate { } 只不过由于

Android源代码之DeskClock (三) Proxy/Delegate Application 框架应用

一.概述 当项目有加壳子,插件化或热修复等需求的时候,能够使用Proxy/Delegate Application框架的方式,在正常的模式中,一个程序一般仅仅有一个Application入口,而Proxy/Delegate模式中须要有两个Application,原程序的Application改为Delegate Application,再新加一个Proxy Application,由Proxy Application 提供一系列的个性化定制,再将所有的context和context相关的引用所有