zoukankan      html  css  js  c++  java
  • 一个C#委托的示例

      public delegate void MsgDelgate(string sMsg);
        protected void Page_Load(object sender, EventArgs e)
        {
            MsgDelgate MsgDelgate1 = new MsgDelgate(SayHello);
            MsgDelgate1 += MsgOut;
            DoSomething(2, 5, MsgDelgate1);
        }
        protected void DoSomething(int iCount1, int iCount2, MsgDelgate notice)
        {
            notice("I am good at figures:" + iCount1.ToString() + "+" + iCount2.ToString() + "=" + (iCount1 + iCount2));
        }
        private void MsgOut(string sMsg)
        {

            PlaceHolderMsg.Controls.Add(new LiteralControl("<span style=\"color:red;\">"+sMsg+"</span>"));
        }
        private void SayHello(string sHello)
        {
            sHello = sHello==null ? sHello : "Hello,My Delegate.<br />";
            PlaceHolderMsg.Controls.Add(new LiteralControl("<span style=\"color:#036;\">" + sHello + "</span>"));
        }

    页面中只含有一个PlaceHolder

    <asp:PlaceHolder ID="PlaceHolderMsg" runat="server"></asp:PlaceHolder>

    为什么会输出这个结果:

    MsgDelgate MsgDelegate1 = new MsgDelegate(SayHello);
    MsgDelegate1 += MsgOut;

    在上面承载两个函数(SayHello&MsgOut),此时并没有参数值,但在SayHello中的?:给空参数赋了值,在DoSomething(int iCount1, int iCount2, MsgDelgate notice)中,委托承载的函数才有参数值。参数就是
    notice("I am good at figures:" + iCount1.ToString() + "+" + iCount2.ToString() + "=" + (iCount1 + iCount2));

    这个例子中,委托在连续地做事情,MsgDelegate1先后受到SayHeloo和MsgOut的“委托”,所以在DoSomething(2, 5, MsgDelgate1)中,MsgDelgate1只被调用一次就可以输出两样东西,做完了两件事情。

    所以结果就那样了

    什么时候使用委托:

    • 当使用事件设计模式时。
    • 当封装静态方法可取时。
    • 当调用主不需要访问实现该方法的对象中的其他属性、方法或接口时
    • 需要方便的组合时。
    • 当类可能需要该方法的多个实现时。

    实际上,在这个示例中,SayHello是一个完全没意义的函数,看这一行sHello = sHello==null ? sHello : "Hello,My Delegate.";

    这一行指出了,如果传入的参数为null,那么就让它为null吧,如果不为null,就让它为"Hello,My Delegate"吧

    也就是说,无论传入何种参数,最后输出的都是"Hello,My Delegate"了。

  • 相关阅读:
    较全的ASCII码对照表
    关于.NET Framework 3.5 SP1 bootstrapper 包(安装和部署)的解决方案
    C#中DllImport用法和路径问题
    在Winform中给的button等控件添加快捷键的几种方法。
    DataGridView之为每行前面添加序号
    【软件设计过程PowerDesigner v12简介】
    死锁与活锁的区别,死锁与饥饿的区别
    性能优化之 — AS3.0对象池运用
    wc之“HelloWorld”
    php之memcache缓存技术
  • 原文地址:https://www.cnblogs.com/xiaobaigang/p/829766.html
Copyright © 2011-2022 走看看