Когда Вы использовали бы делегатов в C#? [закрытый]

В основном один находится в присутствии контекста сохранения JTA, управляемого контейнером, с транзакциями, управляемыми бобами (BMT).

Поэтому, помимо вашего EntityManager, вы также должны ввести в свой DataFetchBean ваш UserTransaction, чтобы начать, совершить или отменить транзакцию.

@Named
@RequestScoped
public class DataFetchBean {
    @PersistenceContext
    EntityManager em;

    @Resource
    private UserTransaction userTransaction;

    ...
}

Затем, в вашем addEmployee методе, вы должны начать и затем совершить транзакцию, поэтому ваши изменения на ваш сотрудник может быть распространен в базу данных.

public void addEmployee() throws Exception {
    Employee employee = new Employee(500000, new Date(335077446), "Josh", "Carribean", 'm', new Date(335077446));

    userTransaction.beginTransaction();
    em.persist(employee);
    userTransaction.commit();
}

Несмотря на это, вам следует подумать о переносе действий базы данных в EJB, вставляя их в свой JSF-компонент, поэтому делегирование на контейнере (например, использовать CMT вместо ручной обработки).

101
задан Bill the Lizard 1 August 2009 в 12:29
поделиться

17 ответов

Теперь, когда у нас есть лямбда-выражения и анонимные методы в C#, я использую, делегирует намного больше. В C# 1, где у Вас всегда должен был быть отдельный метод реализовать логику, с помощью делегата часто, не имел смысла. В эти дни я использую делегатов к:

  • Обработчики событий (для GUI и больше)
  • Стартовые потоки
  • Обратные вызовы (например, для асинхронных API)
  • LINQ и подобный (Список. Найдите и т.д.)
  • Где-либо еще, где я хочу эффективно применить "шаблонный" код с некоторой специализированной логикой внутри (где делегат обеспечивает специализацию)
100
ответ дан Jon Skeet 24 November 2019 в 04:41
поделиться

Параметрический усилитель сравнения в В Массиве. Вид (T [] массив, сравнение Сравнения), Список. Вид (Сравнение сравнения), и т.д.

0
ответ дан GregUzelac 24 November 2019 в 04:41
поделиться

Использование делегатов

  1. Обработка событий
  2. Много Кастинг
0
ответ дан Rajeshwaran S P 24 November 2019 в 04:41
поделиться

Ленивая инициализация параметра! Помимо всех предыдущих ответов (стратегическая модель, шаблон "наблюдатель", и т.д.), делегаты позволяют Вам обрабатывать ленивую инициализацию параметров. Например, предположите, что у Вас есть функциональная Загрузка (), который занимает довольно много времени и возвращает определенный DownloadedObject. Этот объект используется устройством хранения данных в зависимости от определенные условия. Как правило, Вы были бы:

storage.Store(conditions, Download(item))

Однако с делегатами (более точно, лямбды) можно сделать следующее путем изменения подписи хранилища так, чтобы это получило Условие и Func< Объект, DownloadedObject> и используйте его как это:

storage.Store(conditions, (item) => Download(item))

Поэтому устройство хранения данных только оценит делегата при необходимости, выполняя загрузку в зависимости от Условий.

0
ответ дан Santiago Palladino 24 November 2019 в 04:41
поделиться

Любое время Вы хотите инкапсулировать поведение, но вызвать его универсальным способом. Обработчики событий, функции обратного вызова, и т.д. Можно выполнить подобные вещи Интерфейсы использования и броски, но иногда, поведение не обязательно связывается с объект типа или . Иногда у Вас просто есть поведение, которое необходимо инкапсулировать.

0
ответ дан Bob King 24 November 2019 в 04:41
поделиться

События, другие anynch операции

0
ответ дан 24 November 2019 в 04:41
поделиться

Первая строка использования должна заменить The Observer / Заметный (события) шаблон. Второе, хорошая изящная версия Стратегической модели. Различные другие использования могут быть собраны, хотя более тайный, чем эти первые два, я думаю.

0
ответ дан x0n 24 November 2019 в 04:41
поделиться

Я использую делегатов для передачи с потоками.

, Например, у меня могло бы быть приложение форм победы, которое загружает файл. Приложение запускает рабочий поток, чтобы сделать загрузку (который препятствует тому, чтобы GUI заперся). Рабочий поток использует делегатов для отправки сообщений о состоянии (например, прогресс загрузки) назад к основной программе, так, чтобы GUI мог обновить строку состояния.

1
ответ дан Danny Frencham 24 November 2019 в 04:41
поделиться
  1. Для обработчика событий

  2. Для передачи метода в методе параметры

0
ответ дан Patrick Desjardins 24 November 2019 в 04:41
поделиться

Немного отличающееся использование должно ускорить отражение; т.е. вместо того, чтобы использовать отражение каждый раз, можно использовать Delegate.CreateDelegate для создания (введенного) делегата в методе (MethodInfo), и вызов тот делегат вместо этого. Это тогда очень более быстро на вызов, поскольку проверки были уже сделаны.

С Expression, можно также сделать то же для создания кода на лету - например, можно легко создать Expression, который представляет + оператор для типа, выбранного во времени выполнения (для оказания поддержки оператора для дженериков, которые язык не обеспечивает); и можно скомпилировать Expression во введенного делегата - сделанное задание.

5
ответ дан Marc Gravell 24 November 2019 в 04:41
поделиться

Можно использовать делегатов для объявления функциональных переменных определенного типа и параметров.

Пример

Рассматривают "ресурс, одалживая" шаблон. Вы хотите управлять созданием и очисткой ресурса, позволяя клиентскому коду "одолжить" промежуточный ресурс.

Это объявляет тип делегата.

public delegate void DataReaderUser( System.Data.IDataReader dataReader );

Любой метод, соответствующий этой подписи, может использоваться для инстанцирования делегата этого типа. В C# 2.0 это может быть сделано неявно, просто при помощи названия метода, а также при помощи анонимных методов.

Этот метод использует тип в качестве параметра. Отметьте вызов делегата.

public class DataProvider
{
    protected string _connectionString;

    public DataProvider( string psConnectionString )
    {
        _connectionString = psConnectionString;
    }

    public void UseReader( string psSELECT, DataReaderUser readerUser )
    {
        using ( SqlConnection connection = new SqlConnection( _connectionString ) )
        try
        {
            SqlCommand command = new SqlCommand( psSELECT, connection );
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();

            while ( reader.Read() )
                readerUser( reader );  // the delegate is invoked
        }
        catch ( System.Exception ex )
        {
            // handle exception
            throw ex;
        }
    }
}

функция может быть вызвана с анонимным методом следующим образом. Обратите внимание, что анонимный метод может использовать переменные, объявил внешний из себя. Это чрезвычайно удобно (хотя пример немного изобретен).

string sTableName = "test";
string sQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='" + sTableName + "'";

DataProvider.UseReader( sQuery,
    delegate( System.Data.IDataReader reader )
    {
        Console.WriteLine( sTableName + "." + reader[0] );
    } );
12
ответ дан harpo 24 November 2019 в 04:41
поделиться

Найденный другим интересным ответом:

коллега А просто задал мне этот вопрос - какой смысл делегатов в.NET? Мой ответ был очень короток и тот, который он не нашел онлайн: задержать осуществление метода.

Источник: LosTechies

Точно так же, как LINQ делает.

13
ответ дан Maxime Rouiller 24 November 2019 в 04:41
поделиться

подписка eventhandlers к событиям

4
ответ дан Manu 24 November 2019 в 04:41
поделиться

Делегаты используются каждый раз, когда вы используете события - это механизм, с помощью которого они работают.

Кроме того, делегаты очень полезны для таких вещей, как использование запросов LINQ. Например, многие запросы LINQ принимают делегат (часто Func ), который можно использовать для фильтрации.

5
ответ дан 24 November 2019 в 04:41
поделиться

Делегаты часто могут использоваться вместо интерфейса с одним методом, типичным примером этого может быть шаблон наблюдателя. На других языках, если вы хотите получать уведомление о том, что что-то произошло, вы можете определить что-то вроде:

class IObserver{ void Notify(...); }

В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:

myObject.SomeEvent += delegate{ Console.WriteLine("..."); };

Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:

myList.Where(i => i > 10);

Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:

myList.Where(delegate(int i){ return i > 10; });

Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:

myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);

Надеюсь, это поможет!

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

class IObserver{ void Notify(...); }

В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:

myObject.SomeEvent += delegate{ Console.WriteLine("..."); };

Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:

myList.Where(i => i > 10);

Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:

myList.Where(delegate(int i){ return i > 10; });

Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:

myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);

Надеюсь, это поможет!

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

class IObserver{ void Notify(...); }

В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:

myObject.SomeEvent += delegate{ Console.WriteLine("..."); };

Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:

myList.Where(i => i > 10);

Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:

myList.Where(delegate(int i){ return i > 10; });

Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:

myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);

Надеюсь, это поможет!

10
ответ дан 24 November 2019 в 04:41
поделиться

Делегаты очень полезны для многих целей.

Одна из таких целей - использовать их для фильтрации последовательностей данных. В этом случае вы должны использовать делегат предиката, который принимает один аргумент и возвращает истину или ложь в зависимости от реализации самого делегата.

Вот глупый пример - я уверен, что вы можете экстраполировать что-то более полезное из этого:

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String>
        {
            "Nicole Hare",
            "Michael Hare",
            "Joe Hare",
            "Sammy Hare",
            "George Washington",
        };

        // Here I am passing "inMyFamily" to the "Where" extension method
        // on my List<String>.  The C# compiler automatically creates 
        // a delegate instance for me.
        IEnumerable<String> myFamily = names.Where(inMyFamily);

        foreach (String name in myFamily)
            Console.WriteLine(name);
    }

    static Boolean inMyFamily(String name)
    {
        return name.EndsWith("Hare");
    }
}
28
ответ дан 24 November 2019 в 04:41
поделиться

Насколько я знаю, делегаты могут быть преобразованы в указатели на функции. Это НАМНОГО упрощает жизнь при взаимодействии с нативным кодом, который принимает указатели на функции, поскольку они могут быть эффективно объектно-ориентированными, хотя первоначальный программист не предусмотрел для этого никаких условий.

0
ответ дан 24 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: