关联内容
c#基本语法 http://blog.csdn.net/u012085988/article/details/19981161
1、委托
学过c++的人可以这么理解,委托就是一个仿函数(函数对象),里面存储了对象指针,和函数指针。只不过c#不需要程序员手动写这个仿函数,它在内部帮我们完成。
委托使用关键字delegate。语法为 修饰符 + delegate + 返回值 + 委托类型名 + 参数表
public delegate string GetString ( string key );
使用时用这里的GetString其实是相当于类型名,寓意这含有这样的返回值和参数表的一类函数!下面是使用方法
GetString fobj = new GetString(x.getString);
fobj("myKey");
这里传入的参数x.getString。其中x为实例,getString为x的成员函数。其实第一步并没有调用x.getString()函数,而是将x和getString传入GetString构造函数。真正的调用部分在fobj("myKey");
构造委托变量时,也可以用
GetString fobj = x.getString;
除了代理,c#中还可以用Func<T>和Action<T>
delegate只能包含一个方法调用,Action可以实现多播委托。Action用+, +=来添加被委托函数。
delegate还能作用域匿名方法:
Func<string, string> test = delegate(string arg)
{
// 匿名函数函数体
}
test("hehe"); // 调用函数
2、Lambda
=>符号
=>左边是参数,右边是函数体。
Func<double, double, double> fobj = (double x, double y) => {
// 函数体
return x + y;
};
3、事件
事件基于委托,为委托提供了一种 发布/订阅 机制。
同属性一样,事件也有两种写法,一种简写形式,一种全写方式。
public event EventHandler<Arg> eventlist;// 简写方式
private delegate EventHandler<Arg> eventList; // 复杂方式
public event EventHandler<Arg> EventList
{
add
{
eventsList += value;
}
remove
{
eventsList -= value;
}
}
一般都用简写方式就行了,除非有特殊情况,要执行某些特使转换,才会写全定义模式。
处理函数的形式一般也要按照一定规范:如返回值为void, 含有两个参数
public void FuncTest(object sender, Arg arg);
注册事件用+, 注销事件用-;
4、弱事件
这个概念类似于lua中的弱表。当监听器不再使用时,在eventList中仍保留一个引用,那么这个监听器就不能被垃圾回收器回收。为了解决这个问题,可以使用弱事件(WeakEventManager)。