use*_*364 2 c# asp.net closures anonymous-methods
我被要求解释匿名方法的丑陋和优点.
我可能会解释
丑陋的事情
anonymous methods turning quickly into spaghetti code.
Run Code Online (Sandbox Code Playgroud)
好处
我们可以使用匿名方法生成线程安全代码:示例
static List<string> Names = new List<string>(
new string[] {
"Jon Skeet",
"Marc Gravell",
"David",
"Bill Gates"
});
static List<string> FindNamesStartingWith(string startingText)
{
return Names.FindAll(
delegate(string name)
{
return name.StartsWith(startingText);
});
}
Run Code Online (Sandbox Code Playgroud)
但实际上我不知道它是否是线程安全的.我被要求证明它是正确的.任何人都可以帮助我理解 (1)匿名方法的优点(2)上面的代码线程是否安全?
那么,"线程安全"是一个相当广泛的术语.你在想什么样的多线程用法?如果没有任何内容写入列表,我希望它没有任何数据损坏或异常是安全的......
现在,至于匿名方法的"丑陋"......你使用的是C#3吗?如果是这样,请开始使用通常更清晰的lambda表达式:
static List<string> FindNamesStartingWith(string startingText)
{
return Names.FindAll(name => name.StartsWith(startingText));
}
Run Code Online (Sandbox Code Playgroud)
或者,使用LINQ:
static List<string> FindNamesStartingWith(string startingText)
{
return Names.Where(name => name.StartsWith(startingText)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您不一定需要列表:
static IEnumerable<string> FindNamesStartingWith(string startingText)
{
return Names.Where(name => name.StartsWith(startingText));
}
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢查询表达式:
static IEnumerable<string> FindNamesStartingWith(string startingText)
{
return from name in names
where name.StartsWith(startingText)
select name;
}
Run Code Online (Sandbox Code Playgroud)
这些都不像我的意大利面条代码.但是,如果你要问你是否应该使用这个或其他东西,你应该提出一个替代方案.这是一个简单的:
static List<string> FindNamesStartingWith(string startingText)
{
List<string> ret = new List<string>();
foreach (string name in Names)
{
if (name.StartsWith(startingText))
{
ret.Add(name);
}
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
你觉得更清楚了吗?如果是这样,那很好 - 但我怀疑这只是你不熟悉匿名函数,LINQ等等.正如你所看到的,代码要多得多 - 我肯定需要更长的时间来检查它是否正确任何早期的样本.
| 归档时间: |
|
| 查看次数: |
2389 次 |
| 最近记录: |