C#委托

    委托是将方法调用者与目标方法关联起来,即委托是提供程序的一种间接性,如下图创建委托类型 Transformer 该委托类型返回int类型的值同时需要一个int参数,这就说明只要是method-modfiers int method-base method-body参数为int类型的方法都能够被调用。
         
    能够将方法作为参数进行传递,表示方法的数据类型----委托

    
    调用的方式当然是先实例化一个委托变量,然后通过委托实例再进行调用方法,其实委托的实例化所取得值就是想通过委托调用的方。
    
    
    
    
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Test2
{
class Program
{
delegate int Transformer(int x);
static void Main(string[] args)
{
Transformer t = new Transformer(Square);
int result = t(3);
Console.WriteLine(result);
Console.Read();
}
public static int Square(int x)
{
return x * x;
}
}
}
    同时委托实例还可以作为方法参数,这个就实现了在一个方法中调用另一个方法
    
  
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Test2
{
delegate int Transformer(int x);
class Program
{
static void Main(string[] args)
{
int[] value = { 1, 2, 3 };
Util.Transform(value, Square);
foreach(int i in value)
{
Console.Write(i+ " ");
}
Console.Read();
}
public static int Square(int x)
{
return x * x;
}
}
class Util
{
public static void Transform(int[] value,Transformer t )
{
for(int i = 0; i < value.Length; i++)
{
value[i] = t(value[i]);
}
}
}
}
    在这个例子中给Transform传递的委托参数实际是Square方法,返回值和参数相同的方法都可以作为参数传递
    
    多播委托:所有委托实例都具有多播能力,即一个委托实例不仅可以引用一个目标方法还可以引用一组目标方法。用运算符+和+=联合多个委托实例
   
   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Test2
{
public delegate void ProgressReporter(int percentComplete);
class Program
{
static void Main(string[] args)
{
 
ProgressReporter p = WriteProgressToConsole;
p += WriteProgressToFile;
Util.HardWork(p);
Console.Read();
}
public static void WriteProgressToConsole(int percentComplete)
{
Console.WriteLine(percentComplete);
}
public static void WriteProgressToFile(int percentComplete)
{
System.IO.File.WriteAllText("progress.txt", percentComplete.ToString());
}
}
class Util
{
public static void HardWork(ProgressReporter p)
{
for(int i = 0; i < 10; i++)
{
p(i * 10);
System.Threading.Thread.Sleep(100);
}
}
}
}
    在HardWork函数中通过委托实例p来调用了WriteProgressToConsole方法和WriteProgressToFile方法,说明了一个实例调用多个方法
    
    当委托对象指向一个实例方法时,委托对象不仅需维护方法的使用,而且还要维护该方法所属实例的引用
   
   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Test2
{
public delegate void ProgressReporter(int percentComplete);
class Program
{
 
static void Main(string[] args)
{
X x = new X();
ProgressReporter p = x.InstanceProgress;//实例化一个ProgressReporter委托,该委托所引用的方法是类X的实例x引用的InstanceProgress方法
p(99);
Console.WriteLine(p.Target == x);//委托的Target属性表示这个类实例,Target表示调用这个方法的对象
Console.WriteLine(p.Method);
Console.Read();
 
}
}
class X
{
public void InstanceProgress(int percentComplete)
{
Console.WriteLine(percentComplete);
}
}
}
    
    委托中的泛型:委托类可以包含泛型参数。public delegate T Transformr<T>(T arg);表明了这个委托的返回值为T类型,参数为T类。
 
    委托是采用引用的方式进行传递的所以不能delegate d1=d2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值