Многоадресный делегат C#:Creating с булевым типом возврата

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

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

А хорошее эмпирическое правило: только запишите комментарии для объяснения , почему код делает что-то, не , что он делает.

12
задан Shyju 31 August 2009 в 08:43
поделиться

3 ответа

public delegate bool Foo(DateTime timestamp);

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

public bool IsGreaterThanNow(DateTime timestamp)
{
    return DateTime.Now < timestamp;
}

public bool IsLessThanNow(DateTime timestamp)
{
    return DateTime.Now > timestamp;
}

Foo f1 = IsGreaterThanNow;
Foo f2 = IsLessThanNow;
Foo fAll = f1 + f2;

Вызов fAll , в этом случае вызовет как IsGreaterThanNow () , так и IsLessThanNow () .

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

List<bool> returnValues = new List<bool>();
foreach(Foo f in fAll.GetInvocationList())
{
    returnValues.Add(f(timestamp));
}
35
ответ дан 2 December 2019 в 03:43
поделиться

Любой делегат может быть многоадресным делегатом

delegate bool myDel(DateTime s);
myDel s = someFunc;
s += someOtherFunc;

msdn

Полезное свойство объектов делегата в том, что их можно отнести к одному делегировать экземпляр для многоадресной рассылки с помощью оператора +. Составленный делегат вызывает двух делегатов был составлен из. Только делегаты один и тот же тип может быть составлен.

РЕДАКТИРОВАТЬ: В delagate есть метод GetInvocationList , который возвращает список с присоединенными методами.

Вот ссылка на Вызов делегата

foreach(myDel d in s.GetInvocationList())
{
   d();
}
3
ответ дан 2 December 2019 в 03:43
поделиться
class Test
{
    public delegate bool Sample(DateTime dt);
    static void Main()
    {
        Sample j = A;
        j += B;
        j(DateTime.Now);

    }
    static bool A(DateTime d)
    {
        Console.WriteLine(d);
        return true;
    }
    static bool B(DateTime d)
    {
        Console.WriteLine(d);
        return true;
    }
}
2
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

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