.NET中的传统循环与Action委托

时间:2010-03-29 14:16:52

标签: c# delegates action

在了解C#中的Action代表后,我一直在寻找可以在代码中最好地使用它的方法。我想出了这种模式:

Action<string> DoSomething = (lSomething) =>
{
    // Do something
};

DoSomething("somebody");
DoSomething("someone");
DoSomething("somewhere");

如果我使用传统的循环,它看起来像这样:

List<string> lSomeList = new List<string>();
lSomeList.Add("somebody");
lSomeList.Add("someone");
lSomeList.Add("somewhere");

foreach (string lSomething in lSomeList)
{
    // Do something
}

两者之间是否存在明显差异?对我来说,他们看起来同样容易理解和维护,但是我是否还有其他一些标准来区分何时可能优先于另一个?

3 个答案:

答案 0 :(得分:4)

如果您需要能够将操作从一段代码传递到另一段代码,那么将它包装在一个代理中真的很不错。

如果在同一方法中稍微不同的上下文中需要相同的操作,则委托是一个选项 - 尽管将其提取到另一个方法可能更有意义,具体取决于具体情况。

通常我会直接执行代码。您给出的示例并不是特别逼真的IMO - 通常您会有一个列表,无论是调用List<T>.ForEach还是使用普通的foreach循环 - 此时我都赞成{ {1}}循环与Eric Lippert在安东尼链接的博客文章中提供的原因相同。

答案 1 :(得分:3)

你有三个方法调用而不是一个循环和一个方法(或者只是一个循环体)的事实足以让我重新考虑。

半相关,或许阅读这篇博客,看看是否能给你一个不同的视角。 http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

答案 2 :(得分:0)

第一个没有出现循环的模式有一个优势。例如:

Action<string> DoSomething = (lSomething) =>
{
    // Do something
};

DoSomething("somebody");

if (b) DoSomething("somebody2");
else while (F()) DoSomething("somebody3")

...

所以你看到lambda版本更灵活,因为它可以在多个地方调用,而不仅仅是在一个地方。