anonymos方法的丑陋事物和优势-C#

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)上面的代码线程是否安全?

Jon*_*eet 7

那么,"线程安全"是一个相当广泛的术语.你在想什么样的多线程用法?如果没有任何内容写入列表,我希望它没有任何数据损坏或异常是安全的......

现在,至于匿名方法的"丑陋"......你使用的是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等等.正如你所看到的,代码要多得多 - 我肯定需要更长的时间来检查它是否正确任何早期的样本.