c#学习笔记(六)委托

来源:互联网 发布:知道ip查找域名 编辑:程序博客网 时间:2024/05/16 14:43

委托是一种引用方法的类型.一旦为委托分配了方法,该委托与方法具有相同的类型,委托象其他方法一样具有返回值和参数.如 public delegate int MyDelegate(int x ,int y)  与该委托签名相匹配的方法可以分配给该委托.

delegate关键字用于声明一个引用类型,通常委托用于封装命名方法或匿名方法,委托类似与C,C++中的函数指针,但是是类型安全的,可靠的.(可以用委托给对象封装原来类中没有的方法)

命名方法:

// Declare a delegate:
delegate void Del(int x);
// Define a named method:
void DoWork(int k) 
{ /* ... */ }
// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;这被称为使用命名的方法,使用命名方法构造的委托可以封装
静态方法和实例方法.
 
示例:
// Declare a delegatedelegate void Del();class SampleClass
{  
//实例方法    
public void InstanceMethod()    
{        
System.Console.WriteLine("A message from the instance method.");    
}
//静态方法    
static public void StaticMethod()    
{        
  System.Console.WriteLine("A message from the static method.");    
}}
class TestSampleClass
{    
  static void Main()    
{        
  SampleClass sc = new SampleClass();        // 委托封装实例方法
    Del d = sc.InstanceMethod;        
  d();
  //方法作为参数传递给委托       
   // 封装静态方法
        d = SampleClass.StaticMethod;        
    d();    
}
}
委托类型派生自.net Framework中的Delegate类,是密封的,不能被继承.也不能从中派生自定义类.
实例化委托是对象,所以可以作为参数传递,并且可以赋值给属性.方法可以接受作为参数的委托,
并且以后可以调用该委托,这叫异步回调.在较长的进程后用来通知调用方的常用方法.
 
 
自己测试的例子:

public delegate void Del( int message );
class MyClass
{
    static void Main()
    {
        MyClass C=new MyClass();
        Del d = C.Mymethod;
       
        MyClass.Delmethod(1,9,d);
    }
    public static void Delmethod(int i,int j,Del callback)
    {
        callback(i+j);
    }
    public void Mymethod(int m)
    {

        System.Console.WriteLine(m);
    }
   
}

 

附:匿名方法(.net2.0引入),将代码块传递给委托,必须使用匿名委托,顾名思义,不用单独创建方法.方法体直接封装在委托内,不创建单独的方法,这样,实例化委托时减少了系统的编码开销.格式 Del d = delegate ( 参数类型 )

{

  //方法体

};//注意这个分号.(这是初始化委托并不执行)


delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        //使用匿名方法初始化委托
        Printer p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };

         p("The delegate using the anonymous method is called.");

        

        p = new Printer(TestClass.DoWork);//委托的构造函数,还可以这样写 p = TestClass.DoWork;

        

        p("The delegate using the named method is called.");
    }

    // 命名委托

      static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}

 
原创粉丝点击