我是新手,有人可以解释(以下代码)的意义,或者可能链接到一些关于lambda表达式的有用信息?我在测试中遇到以下代码,我想知道为什么有人会这样做:
foo.MyEvent += (o, e) => { fCount++; Console.WriteLine(fCount); };
foo.MyEvent -= (o, e) => { fCount++; Console.WriteLine(fCount); };
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我这是一件简单而不是错误的事情,但我对这些表达方式知之甚少,无法理解为什么要这样做.
我从Microsoft下载了VCSharpSample包,并开始阅读Anonymous Delegates.我可以或多或少地理解代码在做什么,但我不明白它背后的原因.也许如果你给我一些例子,它会导致更清晰的代码和更容易维护,那么我可以绕过它.:)
你能帮我吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
delegate decimal CalculateBonus(decimal sales);
class Player
{
public string Name;
public decimal Score;
public decimal Bonus;
public CalculateBonus calculation_algorithm;
}
class Program
{
static decimal calculateStandardBonus(decimal sales)
{
return sales / 10;
}
static void Main(string[] args)
{
decimal multiplier = 2;
CalculateBonus standard_bonus = new CalculateBonus(calculateStandardBonus);
CalculateBonus enhanced_bonus = delegate(decimal sales) { return multiplier * sales / 10; };
Player[] players = new Player[5];
for …Run Code Online (Sandbox Code Playgroud) 我有这些代码行.
class Program
{
public delegate void printer();
public static void Method()
{
Console.WriteLine("Hello");
}
static void Main(string[] args)
{
printer del = delegate { Method(); };
del();
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我怎么称呼这句话printer del = delegate { Method(); };.
当然它不能被称为匿名方法,因为在这里我有一个命名方法.
我一直在.net 4工作,真的很享受从单一方法返回定制函数的能力,例如:
public Func<object, object> FunctionBuilder(object o)
{ /*build functions, woo*/ }
Run Code Online (Sandbox Code Playgroud)
...但是,如果不是不可能在.net2中执行,这似乎非常困难,因为Func出现在.net3.5(?)中,类似于:
public delegate<object> FunctionBuilder(object o)
{ /*nope*/ }
Run Code Online (Sandbox Code Playgroud)
...是无效的语法..
甚至可以从.net2中的方法返回定制函数吗?
我有以下代码片段(作为示例)查找联系人:
public string Search()
{
string address = "";
ContactManager manager = new ContactManager();
// LookupComplete is just a plain event
manager.LookupComplete += delegate
{
address = manager.Address;
};
manager.SearchFor("bob");
return address; // Address always appears to be populated
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是ContactManager:
public class ContactManager
{
public string Address {get;set;}
public event LookupComplete;
public void SearchFor(string query)
{
SomeParser parser = new Parser();
parser.TokenParsed += new EventHandler<TokenParseEventArgs>(tokenParsed);
parser.Parse(query);
}
private void tokenParsed(object sender,TokenParseEventArgs e)
{
if (e.Message == "EOF")
{ …Run Code Online (Sandbox Code Playgroud) 有人可以告诉我为什么匿名代表的运行速度比普通代表快得多吗?我Stopwatch在for循环中看到了用class 诊断的结果,差异很大.如果您在普通委托中运行以下代码,它运行速度会慢很多.我在视频中看到了这种比较,基本上我被建议使用匿名代表而不是常规代表,以便在有情况时使用.
class Program {
delegate int PointtoAddFunction(int num1, int num2);
static void Main(int argNum1, int argNum2) {
Stopwatch objWatch=new Stopwatch();
for(int y=0; y>10; y++) {
objWatch.Reset();
objWatch.Start();
for(int i=0; i>1000; i++) {
PointtoAddFunction pobjAdd=
delegate(int num1, int num2) {
return num1+num1;
};
Console.WriteLine(pobjAdd.Invoke(2, 2).ToString());
}
objWatch.Stop();
Console.WriteLine(objWatch.EleapsedTickes.ToString());
}
}
static int Add(int num1, int num2) {
return num1+num2;
}
}
Run Code Online (Sandbox Code Playgroud)