Ищет то же самое и, наконец, нашел следующее очень простое решение. Лучшее: это работает из коробки. 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">
. Работает на меня. :)
Они - отличный способ инкапсуляции части кода. Например, при присоединении обработчика событий к кнопке тот обработчик является делегатом. Кнопка не должна знать то, что она делает, как назвать ее в нужное время.
Другим примером является 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)
}
, Но поддержка делегата в платформе позволяет делегатам объединяться в цепочку вместе, вызываться асинхронно, использоваться в качестве обработчиков событий и т.д.
Для больше на делегатах и событиях, видеть моя статья о теме . Его фокусом являются события, но он покрывает делегатов также.
Это - довольно неопределенная тема, но здесь является несколькими вещами рассмотреть -
, Делегаты являются в основном инструментом для очистки, более легким указателем функции. Любое место, где указатели функции использовались в C++, можно думать делегат.
Преимущества для использования их в дизайне:
[Func<T,bool>]
для фильтрации на, не имея необходимость писать новый код в Где метод Потенциальные недостатки:
~can~
, особенно, если используется наивно, ведут для кодирования, который более трудно считать Делегаты служат трем целям:
Наблюдатель
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 */ });
}
Во всех случаях, это - просто вопрос обеспечения краткости.
Делегат в C# является eqv. к указателю функции в C, но он также несет ссылку на экземпляр класса, из которого он был создан.
Все обработчики событий в Windows Forms являются делегатами.
Преимущества, по сравнению с какой? Делегаты могут быть полезными вещами и конечно иметь их место в большом количестве умеренно сложного кода C#. (Каждый раз, когда Вы используете события в классах, Вы неявно используете многоадресных делегатов). Если Вы хотите введение в их синтаксис и использование, я рекомендую следующие статьи:
MSDN MagazineПравовая оговорка: я не говорю, как я использовал делегата, намеченный путь, но это - пример.
я только использовал его однажды, но в основном в нашем приложении пользователь нажимает кнопку 'Complete' для шага, который тогда берет их к странице маршрутизации для решения, куда отправить его затем. Так технически шаг они просто нажали 'Complete' на, действительно не закончен, пока они не направляют его. Но так как я нахожусь на другой странице, у меня легко не было доступа туда, где они просто были.
Поэтому то, что я сделал, было создано делегат к нескольким шагам, которые потребовали специальной обработки (в этом случае электронное письмо), когда нажатое 'Полное', и когда они направили ее на следующей странице, я проверю на существование делегата и если это был там вызов это для увольнения моего 'сохраненного' события.
Творческий: вероятно, неправильно: возможно, работа: определенно.
Как я сказал, вероятно, не, как это было предназначено, чтобы использоваться, но кодирование является таким же искусства как научное право?
Я помню раннюю платформу GUI Java, которая не имела никакого понятия о делегатах или маршрутизации команд. Для создания кнопки, которая делает что-то, Вы имели к Кнопка подкласса, и переопределите метод щелчка. Вы закончили с партиями и большим количеством подклассов элемента UI с небольшими битами Вашего кода приложения в них.
код, который обрабатывает тот щелчок, должен пойти куда-нибудь, и на языке OO как Java или C#, он должен пойти на класс, но делегаты позволяют ему происходить на удобном месте. Это часто приводит к наличию слишком большого количества кода, делающего слишком много разных вещей в классе формы, но это - другой вопрос.