嘱托学习笔记后续：泛型委托及委托中所涉及到匿名方法、Lambda表达式

www.MyException.Cn  网友分享于：2015-02-08  浏览：0次

最初学习c#时，感觉委托、事件这块很难，其中在学习的过程中还写了一篇学习笔记：委托、事件学习笔记。今天重新温故委托、事件，并且把最近学习到和委托相关的匿名方法、Lambda表达式及泛型委托记录下来，以备复习使用。

日常工作中，常常见到委托用在具体的项目中。而且委托使用起来相对来说也是非常简单的，下面列举一个委托实例用以说明如何使用委托，代码如下：

```class Program
{
public delegate int CalculateDelegate(int x, int y);

static void Main(string[] args)
{
int result = calculateDelegate(2, 3);
}

public static int Add(int x, int y)
{
return x + y;
}
}```

1）声明一个委托：public delegate int CalculateDelegate(int x, int y);

3）调用委托：int result = calculateDelegate(2, 3);

1）声明一个委托

2）定义一个委托要绑定的方法

3）定义一个委托，绑定上述定义的方法

```CalculateDelegate calculateDelegate = new CalculateDelegate(Add);

public static int Add(int x, int y)
{
return x + y;
}```

`CalculateDelegate calculateDelegate = delegate(int x, int y){return x + y;};`

`this.btnExit .Dispatcher .Invoke (new Action(() => {}));`

Lambda表达式：

`CalculateDelegate calculateDelegate = (int x, int y) => { return x + y; };`

`CalculateDelegate calculateDelegate = (x, y) => { return x + y; };`

`CalculateDelegate calculateDelegate = (x, y) => x + y;`

Action

```class Program
{
public delegate void Action();

static void Main(string[] args)
{
Action action = new Action(Method);
action();
}

private static void Method()
{
Console.WriteLine("i am is a action");
}
}```

```Action action = () => { Console.WriteLine("i am is a action"); };
action();```

Action<T>

```class Program
{
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

static void Main(string[] args)
{
Action<int,int> action = new Action<int,int>(Method);
action(2,3);
}

private static void Method(int x,int y)
{
Console.WriteLine("i am is a action");
}
}```

```Action<int, int> action = (x, y) => { Console.WriteLine("i am is a action"); };
action(2,3);```

Fun<T>

```class Program
{
public delegate TResult Fun<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

static void Main(string[] args)
{
Fun<int, int, bool> fun = new Fun<int, int, bool>(Method);
bool ret = fun(2,3);
}

private static bool Method(int x,int y)
{
if (x + y == 5)
{
return true;
}
else
{
return false;
}
}
}```

```Fun<int, int, bool> fun = (x, y) =>
{
if (x + y == 5)
{
return true;
}
else
{
return false;
}
};

bool ret = fun(2,3);```

Fun<T>没有参数有返回值的情况：

```Fun<bool> fun = () =>
{
int x = 4;
int y = 3;
if (x + y == 5)
{
return true;
}
else
{
return false;
}

};

//也可以如此编写
Fun<bool> fun = () => false;```

在平时的项目中，常见的委托种类及实例本质上也是上述所说的几种。除此之外还有一些其他的委托方法，资质有限精力有限，此处暂且不提，以后碰到在另当别论。

2楼上位者的怜悯
1.“匿名方法构成的委托”，我觉得不太准确，应该是大部分时候编辑器会帮你把方法放入合适的委托，有些地方编辑器是帮不了你的，比如：，Control.Invoke(delegate)，这个地方必须放委托，它不能确定你的方法是什么样子的，，2.Funclt;boolgt; func = () =gt; true;，Func委托是可以没有参数的
Re: lhb62232397
@上位者的怜悯，非常感谢提出的意见，已修改。
1楼ChuckLu

Re: lhb62232397
@ChuckLu，以前有选择性的看过，what？