Arhn - архитектура программирования

Традиционный цикл против делегата действия в .NET

Узнав о делегате 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
}

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

29.03.2010

Ответы:


1

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

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

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

29.03.2010

2

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

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

29.03.2010

3

Есть преимущество у первого узора, который не выходит с петлями. Пример:

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

DoSomething("somebody");

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

...

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

25.01.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..