关于委托
1.什么是委托
委托就是将一个方法作为一个参数进行传递,从而可以在另一个方法中进行使用。
2.为什么要使用委托
首先,在c#委托是一个引用类型的存在,这就意味着你在使用委托之前就必须去实例化它
下面这段话是在其他文章中看到的,引用一下
“没有委托 就没有安全指针用
没有委托 就没有事件用
没有委托 就没有回调用
没有委托 也没有异步调用
没有委托 就没有多个进程
没有委托 就没有windows form
没有委托 那么你也不用学习.net 了
那么你说委托 有什么用?”
在使用委托时首先要 定义——>声明——>实例化——>作为参数传递给方法——>使用委托。下面就具体看下如何使用委托的:
定义委托 :
这是一个具有bool类型返回值而且带有泛型参数的一个委托;
public delegate bool MyFindDelegate<T>(T t);
下面这个方法中声明了对该委托进行了声明
public static void MyFind<T>(List<T> list, MyFindDelegate<T> myFindDelegate)
{
foreach (var item in list)
{
if (myFindDelegate(item))
{
Console.WriteLine("Result is :" + item);
break;
}
}
}
最后是调用该委托并执行
static void Main(string[] args)
{
//MyFind(list, toDo);
MyFind(list, delegate (int i)
{
return i == 4;
});
MyFind(list,m=>m==2);
}
3.关于action<> 以及Func<>
区别:当我们的方法无返回值的时候使用action<>,有返回值的时候使用Func<>
action<> 为了大家更加方便的使用委托,不用每次使用前都去定义一个delegate,于是微软就定义了action,其实就是对delegate的一个封装,
Func<string ,int,string> 该委托中最多可以添加16个参数,其中默认最后一个为返回值类型,如果只有一个参数,则第一个参数就是返回值
4.多播委托及事件event
多播委托:
1可以使用+=、 -=将方法赋值给委托类型
2.可以通过delegateName()直接触发
以下代码为多波委托的简单使用,可直接在应用台控制程序中执行
public delegate void MutilDelegate();
static void Main(string[] args)
{
Presson presson = new Presson();
presson.DelMutil += Test1;
presson.DelMutil += Test2;
presson.DelMutil += Test3;
presson.PressonRun();
//MutilDelegate aa = null;
//aa += Test1;
//aa += Test2;
//aa += Test3;
//aa();
}
public static void Test1()
{
Console.WriteLine("This is Test1");
}
public static void Test2()
{
Console.WriteLine("This is Test2");
}
public static void Test3()
{
Console.WriteLine("This is Test3");
}
public class Presson
{
public MutilDelegate DelMutil { get; set; }
public void PressonRun()
{
DelMutil();
}
}
事件:
1.类似多播委托,本质更像是委托的一个实例,但是具有封装性。
2.不像委托一样可以直接赋值,但是可以通过+= 和 -=增加和移除函数。
3.不能像delegate一样在类的外部直接定义使用
事件的使用与多波委托的使用基本类似,唯一的区别在于多波委托可以直接进行方法的赋值,而事件不行,事件必须通过+=、-=的操作进行赋值,这也提高了事件使用的安全性,确保了事件不被随意的调用
public delegate void EventDel(string aa);
static void Main(string[] args)
{
Presson presson = new Presson("张三", "3");
presson.eventDel += EventHandel;
presson.PressonRun();
}
private static void EventHandel(string msg)
{
Console.WriteLine(msg);
}
public class Presson
{
public Presson(string UserName, string Times)
{
this._UserName = UserName;
this._Times = Times;
}
public string _UserName { get; set; }
public string _Times { get; set; }
public event EventDel eventDel;
public void PressonRun()
{
eventDel("这是" + this._UserName + "的第" + this._Times + "次失败");
}
}