C# - Кто-то может сказать мне, почему и где я должен использовать делегатов? [дубликат]

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

https://api.highcharts.com/highcharts/series.column.tooltip ,

[ 119], но, например, useHTML доступно только для установки в основном объекте конфигурации всплывающей подсказки:

https://api.highcharts.com/highcharts/tooltip

Таким образом, вы можете включить useHTML следующим образом:

plotOptions: {
        ...,
        tooltip: {
            headerFormat: '',
            pointFormat: '' +
                '' +
                '',
            footerFormat: '

{series.name}  

FS:{point.x}
 AT:{point.y}
', valueDecimals: 2 } } }, tooltip: { useHTML: true },

или переместить все опции в основной объект конфигурации:

tooltip: {
    useHTML: true,
    headerFormat: '',
    pointFormat: '' +
        '' +
        '',
    footerFormat: '

{series.name}  

FS:{point.x}
 AT:{point.y}
', valueDecimals: 2 },

Live demo: https: // jsfiddle.net/BlackLabel/ev4pnuat/

8
задан Alex 29 January 2009 в 12:19
поделиться

11 ответов

Что точно Вы подразумеваете под делегатами? Вот два пути, которыми они могут использоваться:

void Foo(Func<int, string> f) {
 //do stuff
 string s = f(42);
 // do more stuff
}

и

void Bar() {
 Func<int, string> f = delegate(i) { return i.ToString(); } 
//do stuff
 string s = f(42);
 // do more stuff
}

Точка во второй - то, что можно объявить новые функции на лету как делегаты. Это может быть в основном заменено лямбда-выражениями и полезно любое время, у Вас есть маленькая часть логики, которую Вы хотите 1) передать другой функции, или 2) просто выполниться неоднократно. LINQ является хорошим примером. Каждая функция LINQ берет лямбда-выражение в качестве своего аргумента, указывая поведение. Например, если у Вас есть a List<int> l затем l.Select(x=>(x.ToString()) назовет ToString () на каждом элементе в списке. И лямбда-выражение, которое я записал, реализовано как делегат.

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

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

6
ответ дан 5 December 2019 в 04:55
поделиться

События являются самым очевидным примером. Сравните, как шаблон "наблюдатель" реализован в Java (интерфейсы) и C# (делегаты).

Кроме того, много новых C# 3 функции (например, лямбда-выражения) основаны на делегатах и упрощают их использование еще больше.

4
ответ дан 5 December 2019 в 04:55
поделиться

Я, прежде всего, использую для легкого асинхронного программирования. При начинании метода с помощью делегаты Начинают..., метод действительно легок, если Вы хотите запустить и забыть.

Делегат может также использоваться как интерфейс, когда интерфейсы не доступны. Например, вызывающие методы от COM-классов, внешние классы .NET и т.д.

6
ответ дан 5 December 2019 в 04:55
поделиться

.NET 1,0 делегата:

this.myButton.Click += new EventHandler(this.MyMethod);

.NET 2,0 делегата:

this.myOtherButton.Click += delegate {
    var res = PerformSomeAction();
    if(res > 5)
        PerformSomeOtherAction();
};

Они кажутся довольно полезными. Как насчет:

new Thread(new ThreadStart(delegate {
    // do some worker-thread processing
})).Start();
11
ответ дан 5 December 2019 в 04:55
поделиться

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

   var query = collection.Where( c => c.Kind == ChosenKind )
                         .Select( c => new { Name = c.Name, Value = c.Value } )
                         .OrderBy( (a,b) => a.Name.CompareTo( b.Name ) );
2
ответ дан 5 December 2019 в 04:55
поделиться

Одно из преимуществ Делегатов находится в асинхронном выполнении.

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

2
ответ дан 5 December 2019 в 04:55
поделиться

Например, в приложениях мультипотока. Если Вы хотите, чтобы несколько потоков использовали некоторое управление, Вы, shoul используют делегатов. Извините, код находится в VisualBasic.

Сначала Вы объявляете делегата

Private Delegate Sub ButtonInvoke(ByVal enabled As Boolean)

Запишите функцию для позволения/запрещения кнопки из нескольких потоков

Private Sub enable_button(ByVal enabled As Boolean)
    If Me.ButtonConnect.InvokeRequired Then

        Dim del As New ButtonInvoke(AddressOf enable_button)
        Me.ButtonConnect.Invoke(del, New Object() {enabled})
    Else
        ButtonConnect.Enabled = enabled
    End If

End Sub
3
ответ дан 5 December 2019 в 04:55
поделиться

Технически делегат является ссылочным типом, используемым для инкапсуляции метода с определенной подписью и типом возврата

2
ответ дан 5 December 2019 в 04:55
поделиться

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

ThreadPool.QueueUserWorkItem(delegate
{
    // This code will run on it's own thread!
});

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

TimmysSpecialClass.DoSomethingCool(this.AlertWhenDone);
1
ответ дан 5 December 2019 в 04:55
поделиться

За пределами их роли в событиях, которые Ваш, вероятно, знакомый с тем, если Вы использовали winforms или asp.net, делегаты полезны для того, чтобы сделать классы более гибкими (например, путь они используются в LINQ).

Гибкость для "Нахождения" вещей довольно распространена. У Вас есть набор вещей, и Вы хотите позволить находить вещи. Вместо того, чтобы предполагать каждый способ, которым кто-то мог бы хотеть найти вещи, можно теперь позволить вызывающей стороне предоставлять алгоритм так, чтобы они могли искать набор однако, они считают целесообразным.

Вот тривиальный пример кода:

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

namespace Delegates
{
    class Program
    {
        static void Main(string[] args)
        {
            Collection coll = new Collection(5);
            coll[0] = "This";
            coll[1] = "is";
            coll[2] = "a";
            coll[3] = "test";

            var result = coll.Find(x => x == "is");

            Console.WriteLine(result);

            result = coll.Find(x => x.StartsWith("te"));

            Console.WriteLine(result);

    }

}

public class Collection
{
    string[] _Items;

    public delegate bool FindDelegate(string FindParam);

    public Collection(int Size)
    {
        _Items = new string[Size];

    }

    public string this[int i]
    {
        get { return _Items[i]; }
        set { _Items[i] = value; }
    }

    public string Find(FindDelegate findDelegate)
    {
        foreach (string s in _Items)
        {
            if (findDelegate(s))
                return s;
        }
        return null;
    }

}
}

Вывод

тест

1
ответ дан 5 December 2019 в 04:55
поделиться

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

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

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

0
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

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