Традиционный цикл против делегата действия в .NET - PullRequest
1 голос
/ 29 марта 2010

Узнав о делегате Action в C #, я искал способы, как наилучшим образом использовать его в своем коде. Я придумал этот шаблон:

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 ]

4 голосов
/ 29 марта 2010

Если вам нужно передать действие из одного фрагмента кода в другой, очень приятно заключить его в делегат.

Если вам требуется одно и то же действие в несколько разных контекстах одного и того же метода, делегат имеет параметр one - хотя его извлечение в другой метод может иметь больше смысла, в зависимости от ситуации.

Обычно Я просто хотел бы выполнить код напрямую. Пример, который вы привели, не очень реалистичен для ИМО - обычно у вас есть список в любом случае, и вы либо вызываете List<T>.ForEach, либо используете простой цикл foreach - в этот момент я бы предпочел цикл foreach для те же причины, по которым Эрик Липперт приводит в своем блоге сообщение, на которое ссылается Энтони.

3 голосов
/ 29 марта 2010

Тот факт, что у вас есть три вызова метода по сравнению с циклом и один метод (или просто тело цикла) будет достаточно, чтобы заставить меня пересмотреть.

Полусвязанные, возможно, прочитайте этот блог и посмотрите, еслиэто дает вам другую точку зрения.http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

0 голосов
/ 26 января 2012

Преимущество первого паттерна заключается в том, что в нем нет петель. Пример:

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

DoSomething("somebody");

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

...

Итак, вы видите, что лямбда-версия более гибкая, потому что ее можно запускать в нескольких местах, а не только в одном месте.

...