当前位置:编程学习 > C#/ASP.NET >>

委托是这样的吗

public  class   a1
{  public delegata void del(string ss);
public void hhhglj()
{ messagebox.show("dddddddddddddd");
}
}
del ss=new del(hhhglj);
ss(textbox1.text);

这就是所谓的委托吗?其中实际的好处是什么呢?,我实在不清楚\不明白 --------------------编程问答-------------------- 能把方法当参数传递,使程序更抽象 --------------------编程问答-------------------- 委托可以替代C++的函数指针,而且还可以用于回调函数.还是很有用处的,实例委托时候就传入具体的方法参数
是你写的这个del ss=new del(hhhglj);  --------------------编程问答-------------------- 平常我们能传递字符串,数组等等。
而委托使得我们能把函数传来传去。

using System;

public delegate void Del(string ss);
public class A1
{
  public Del StringDeleted;
  public DeleteString()
  {
    if( StringDeleted != null )
    {
      StringDeleted("Someone has deleted my string");
    }
  }
}
public class Program
{
  static void Main()
  {
     A1 a = new A1();
     a.DeleteString();
     Console.ReadLine();

     a.StringDeleted = OnStringDelete;                //<--- 传递一个函数,以便得到通知。
     a.DeleteString();                                //Log: Someone has deleted my string
     Console.ReadLine();
  }

  static void OnStringDelete(string ss)
  {
     Console.WriteLine("Log: " + ss );
  }
}
--------------------编程问答-------------------- 如上面所说,委托可以将方法当作参数来传递,尤其是当把参数设定为委托时,更加方便灵活。 况且委托也可以和事件结合 --------------------编程问答-------------------- 你这个写的有问题吧,del是一个带一个参数的委托,但hhhglj是一个无参方法,ss能实例化成功? --------------------编程问答-------------------- 委托还有一个重要的应用是在 事件 上,通过委托处理各种事件 
事件引发---〉对应的handller(委托)---〉执行委托的方法
--------------------编程问答-------------------- 其实可以这样理解,委托可以看作是方法的集合,该方法带有相同的参数列表

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication7
{
    class Program
    {
        public delegate void Del(string ss);

        public static void Show(string ss)
        {
            Console.WriteLine(ss);
        }

        public static void ShowLZ(string ss)
        {
            Console.WriteLine("楼主,{0}", ss);
        }

        static void Main(string[] args)
        {
            Del del1 = Show;
            del1("其实我的真正身份是Show,是del1装B装的");
            Del del2 = ShowLZ;
            del2("给分给我啊");
            Console.ReadKey();
        }
    }
}

--------------------编程问答-------------------- FYI


using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate_01
{    //the delegate defined here has none arguments
 
    class Currency
    {
        public uint Dollars;
        public ushort Cents;

        /// <summary>
        /// constructor function
        /// </summary>
        /// <param name="dollars"></param>
        /// <param name="cents"></param>
        public Currency(uint dollars, ushort cents)
        {
            if (cents >99)
            {
                dollars += (uint)(cents / 100);
                cents = (ushort)(cents % 100);
            }
            this.Dollars = dollars;
            this.Cents = cents;
        }

        /// <summary>
        /// override ToString() function
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("{0}   Dollars     {1}   Cents", this.Dollars, this.Cents);
        }

        /// <summary>
        /// add a static function with the same signature as Currency
        /// </summary>
        /// <returns></returns>
        public static string GetCurrencyUnit()
        {
            return "Cognizant.com";
        }
    }

    class Program
    {
        // define a delegate with none arguments
        private delegate string GetAString();

        static void Main(string[] args)
        {
            int x = 100;
            GetAString astr = new GetAString(x.ToString); // int.ToString();
            Console.WriteLine("x string is  \"{0}\"", astr());
            Currency balance = new Currency(13,153);
            astr = new GetAString(balance.ToString); // the parameter should be the method's name only 
                                                                          // the ToString() function here was override in the class Currency
            Console.WriteLine("balabce string is \"{0}\"", astr ());
            astr = new GetAString(Currency.GetCurrencyUnit); // the parameter should be the method's name only 
            Console.WriteLine("GetAString :  \"{0}\"", astr());

            Console.ReadKey();
        }
    }
}



刚好这两天在学习委托。

委托要注意的地方就是
astr = new GetAString(balance.ToString)
balance.ToString 是一个   返回类型是 string  无参数的函数, 和 定义 delegate 的签名要一样!  
private delegate string GetAString(); --------------------编程问答-------------------- 关注下 ~~ --------------------编程问答-------------------- 委托 顾名思意就是 某种方法的委托(代理)中心
比较生动的讲解请看http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html --------------------编程问答-------------------- 委托,委托,不大好理解。

今天记住一句话:把函数当参数。 --------------------编程问答-------------------- --------------------编程问答-------------------- 在异步中很好用 --------------------编程问答-------------------- 委托是用来实现一个线程去操作另外一个线程中的控件的,这是因为C#中不允许一个线程去直接对另外的线程中的控件进行操作,这是不安全的,它会引起异常.
委托是一个用来解决这种问题的方法,也可以使用BackGroundWork
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,