大话委托(一)
/*
假如实现一个功能,这个功能是在CMD里面打印
item=1
item=2
item=3
由一个函数执行
private static void Print(int i)
{
Console.WriteLine(i);
}
你可以写
for(int i=1;i<4;i++)
{
Print(int i);
}
这样当然是可以的但是并不太符合C#的规范,因为C#是面向组件的编程就是说留一个接口给外界(可能是一个方法,
调用者调用这个方法),调用者就不必写循环来调用了。
如果调用者就用一个函数
Counter(1,3 ,...)
第三参数能传递一个方法就好了 连续在执行这个方法;但是传递的要么是值类型,要么是引用类型,
方法 是什么类型呢?哈哈,C#给我们提供了一个方法的类型叫做delegate 就是委托登场了 我们可以传递一个方法的“类”
就像我们传递一个引用类型一样,好我们编写一下代码 声明这个“类”:
internal delegate void FeedBack(int x),如果实在记不住的话 就想着他是一个“类”
internal class(delegate) void FeedBack 但是这个“类” 他有参数 就把他当作有“参数的类”吧。
这个“类”的实例(就是方法) 也必须遵循这个类的规则 就是 void int x 返回值为空 参数是int类型,
如果要声明一个类的实例 应该用NEW
这个委托类也是一样哦 他也NEW 哦...
FeedBack fb=new FeedBack(); 额?貌似这个类?好像不能执行?他没有 属性啦,方法啦什么的?委托类就是执行方法的嘛
而且是“一类方法”就是签名和返回值一样的东东啦,好啦,我们给他传递一个方法这个方法和这个委托类有一样的签名和返回
值。
FeedBack fb=new FeedBack(FeedBackToConsole);
好啊,咱们写完了类 俺要传递参数咯,俺有类型咯,俺可以传递哦,但是要有准备工作,要把这个“类” 的实例写出来啊,
private static void FeedBackToConsole(int value)
{
Console.WriteLine("item="+i);
}
俺们要传递咯,
Counter(1,3, new FeedBack(FeedBackToConsole)) ;
这一行就是传递 “类的实例” 了 new FeedBack(FeedBackToConsole)语法是否难以理解?
大家想想 我传递一个实例的时候 如果直接传递 new FeedBack(); 这个只是一个“类”啊!!他不知道执行那个方法,他并没有具体的指向到
哪个方法啊,我们把方法给他 new FeedBack(FeedBackToConsole)) ;
好了万事俱备,只欠东风了,写Counter方法吧
private void Counter(int from ,int to ,FeedBack fb)
{
for(int val=from ;val<=to;val++)
{
}
}
又蒙了吗?
主要在
if (fb!=null)
{
fb(val);
}
这里吧?
fb(val); 这里吧?
fb是我传递的一个实例,就是说fb指向这个实例的方法 我就可以用fb代替 FeedBackToConsole方法了啊 ,因为直接传递
一个方法是不行的 我传递一个类的实例 这个实例指向这个方法。源代码如下,仔细研究吧。
{
public class Program
{
internal delegate void FeedBack(int value);
public static void Main()
{
StaticDelegateDemo();
}
private static void StaticDelegateDemo()
{
Console.WriteLine("--------start------------");
Counter(1,3,new FeedBack(Program.FeedBackToConsole));//可以直接写 FeedBackToConsole
Console.WriteLine("--------end------------");
}
private static void Counter(int from ,int to ,FeedBack fb)
{
for(int val=from;val<=to;val++)
{
if(fb!=null)
{
fb(val);
}
}
}
private static void FeedBackToConsole(int value)
{
Console.WriteLine(value);
}
}
}
假如实现一个功能,这个功能是在CMD里面打印
item=1
item=2
item=3
由一个函数执行
private static void Print(int i)
{
Console.WriteLine(i);
}
你可以写
for(int i=1;i<4;i++)
{
Print(int i);
}
这样当然是可以的但是并不太符合C#的规范,因为C#是面向组件的编程就是说留一个接口给外界(可能是一个方法,
调用者调用这个方法),调用者就不必写循环来调用了。
如果调用者就用一个函数
Counter(1,3 ,...)
第三参数能传递一个方法就好了 连续在执行这个方法;但是传递的要么是值类型,要么是引用类型,
方法 是什么类型呢?哈哈,C#给我们提供了一个方法的类型叫做delegate 就是委托登场了 我们可以传递一个方法的“类”
就像我们传递一个引用类型一样,好我们编写一下代码 声明这个“类”:
internal delegate void FeedBack(int x),如果实在记不住的话 就想着他是一个“类”
internal class(delegate) void FeedBack 但是这个“类” 他有参数 就把他当作有“参数的类”吧。
这个“类”的实例(就是方法) 也必须遵循这个类的规则 就是 void int x 返回值为空 参数是int类型,
如果要声明一个类的实例 应该用NEW
这个委托类也是一样哦 他也NEW 哦...
FeedBack fb=new FeedBack(); 额?貌似这个类?好像不能执行?他没有 属性啦,方法啦什么的?委托类就是执行方法的嘛
而且是“一类方法”就是签名和返回值一样的东东啦,好啦,我们给他传递一个方法这个方法和这个委托类有一样的签名和返回
值。
FeedBack fb=new FeedBack(FeedBackToConsole);
好啊,咱们写完了类 俺要传递参数咯,俺有类型咯,俺可以传递哦,但是要有准备工作,要把这个“类” 的实例写出来啊,
private static void FeedBackToConsole(int value)
{
Console.WriteLine("item="+i);
}
俺们要传递咯,
Counter(1,3, new FeedBack(FeedBackToConsole)) ;
这一行就是传递 “类的实例” 了 new FeedBack(FeedBackToConsole)语法是否难以理解?
大家想想 我传递一个实例的时候 如果直接传递 new FeedBack(); 这个只是一个“类”啊!!他不知道执行那个方法,他并没有具体的指向到
哪个方法啊,我们把方法给他 new FeedBack(FeedBackToConsole)) ;
好了万事俱备,只欠东风了,写Counter方法吧
private void Counter(int from ,int to ,FeedBack fb)
{
for(int val=from ;val<=to;val++)
{
}
}
又蒙了吗?
主要在
if (fb!=null)
{
fb(val);
}
这里吧?
fb(val); 这里吧?
fb是我传递的一个实例,就是说fb指向这个实例的方法 我就可以用fb代替 FeedBackToConsole方法了啊 ,因为直接传递
一个方法是不行的 我传递一个类的实例 这个实例指向这个方法。源代码如下,仔细研究吧。
*/
using System;
namespace FeedBack{
public class Program
{
internal delegate void FeedBack(int value);
public static void Main()
{
StaticDelegateDemo();
}
private static void StaticDelegateDemo()
{
Console.WriteLine("--------start------------");
Counter(1,3,new FeedBack(Program.FeedBackToConsole));//可以直接写 FeedBackToConsole
Console.WriteLine("--------end------------");
}
private static void Counter(int from ,int to ,FeedBack fb)
{
for(int val=from;val<=to;val++)
{
if(fb!=null)
{
fb(val);
}
}
}
private static void FeedBackToConsole(int value)
{
Console.WriteLine(value);
}
}
}

浙公网安备 33010602011771号