Каковы преимущества делегатов? [дубликат]

Ищет то же самое и, наконец, нашел следующее очень простое решение. Лучшее: это работает из коробки. 1. измените свой источник строк:

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2. использование подстановки строки:

c.getString(R.string.welcome_messages,name,count);

где c - это контекст, name - строковая переменная, а count - ваш int variable

В файле res / strings.xml вам нужно включить

<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">

. Работает на меня. :)

23
задан Joel Coehoorn 12 March 2009 в 16:08
поделиться

7 ответов

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

Другим примером является LINQ - фильтрация, проектируя и т.д., что все требуют того же вида шаблона кода; все, что изменяется, является логикой для представления фильтра, проекция и т.д. С лямбда-выражениями в C# 3 (которые преобразовываются в делегатов или деревья выражений), это делает это действительно простым:

var namesOfAdults = people.Where(person => person.Age >= 18)
                          .Select(person => person.Name);

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

Другой способ думать о делегате как тип интерфейса отдельного метода. Например, EventHandler тип делегата немного похож:

public interface IEventHandler
{
    void Invoke(object sender, EventArgs e)
}

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

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

44
ответ дан Jon Skeet 28 November 2019 в 22:33
поделиться

Это - довольно неопределенная тема, но здесь является несколькими вещами рассмотреть -

, Делегаты являются в основном инструментом для очистки, более легким указателем функции. Любое место, где указатели функции использовались в C++, можно думать делегат.

Преимущества для использования их в дизайне:

  • Может привести к легкому повторному использованию кода
  • , Может обеспечить, большое количество гибкости в Ваших проектах
  • Позволяют Вам разрабатывать библиотеки и классы, которые легко расширяемы, так как это обеспечивает простой способ сцепиться в другой функциональности (например, где пункт в LINQ может использовать делегата [Func<T,bool>] для фильтрации на, не имея необходимость писать новый код в Где метод

Потенциальные недостатки:

  • Они ~can~, особенно, если используется наивно, ведут для кодирования, который более трудно считать
  • , Они могут ввести поведение в компонент, который неожидан, так как сторонний код из управления назовут (Например, если кто-то присоединит делегата в одном из событий, которое вызывает бесконечный цикл, это может заставить класс выглядеть плохо, даже при том, что это не имеет никакого отношения к Вам)
12
ответ дан dreamweiver 28 November 2019 в 22:33
поделиться

Делегаты служат трем целям:

  1. упрощенное внедрение А шаблона The Observer
  2. упрощенное внедрение А обратных вызовов
  3. Анонимные блоки кода (одноразового использования)

Наблюдатель

public class Something
{
    public event EventHandler SomethingHappened;
}

public class SomethingConsumer
{
    private mySomething = new Something();

    public void WireUpEvents()
    {
        mySomething.SomethingHappened += whenSomethingHappened;
    }

    private void whenSoemthingHappened(object sender, EventArgs e)
    {
        // do something
    }
}

Обратный вызов

public void DoSomethingAsynchronously(EventHandler callBack)
{
    // long running logic.
    callBack(this, EventArgs.Empty);
}

Анонимный код одноразового использования

public void DoSomethingReusably(Action nonReusableCode)
{
    // reusable code
    nonReusableCode();
    // more reusable code
}

public void DoALotOfSomething()
{
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
}

Во всех случаях, это - просто вопрос обеспечения краткости.

5
ответ дан Michael Meadows 28 November 2019 в 22:33
поделиться

Делегат в C# является eqv. к указателю функции в C, но он также несет ссылку на экземпляр класса, из которого он был создан.

Все обработчики событий в Windows Forms являются делегатами.

2
ответ дан Joshua 28 November 2019 в 22:33
поделиться

Преимущества, по сравнению с какой? Делегаты могут быть полезными вещами и конечно иметь их место в большом количестве умеренно сложного кода C#. (Каждый раз, когда Вы используете события в классах, Вы неявно используете многоадресных делегатов). Если Вы хотите введение в их синтаксис и использование, я рекомендую следующие статьи:

MSDN Magazine
2
ответ дан Noldorin 28 November 2019 в 22:33
поделиться

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

я только использовал его однажды, но в основном в нашем приложении пользователь нажимает кнопку 'Complete' для шага, который тогда берет их к странице маршрутизации для решения, куда отправить его затем. Так технически шаг они просто нажали 'Complete' на, действительно не закончен, пока они не направляют его. Но так как я нахожусь на другой странице, у меня легко не было доступа туда, где они просто были.

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

Творческий: вероятно, неправильно: возможно, работа: определенно.

Как я сказал, вероятно, не, как это было предназначено, чтобы использоваться, но кодирование является таким же искусства как научное право?

2
ответ дан Jeff Keslinke 28 November 2019 в 22:33
поделиться

Я помню раннюю платформу GUI Java, которая не имела никакого понятия о делегатах или маршрутизации команд. Для создания кнопки, которая делает что-то, Вы имели к Кнопка подкласса, и переопределите метод щелчка. Вы закончили с партиями и большим количеством подклассов элемента UI с небольшими битами Вашего кода приложения в них.

код, который обрабатывает тот щелчок, должен пойти куда-нибудь, и на языке OO как Java или C#, он должен пойти на класс, но делегаты позволяют ему происходить на удобном месте. Это часто приводит к наличию слишком большого количества кода, делающего слишком много разных вещей в классе формы, но это - другой вопрос.

1
ответ дан Anthony 28 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

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