Как правильно использовать делегат? - PullRequest
4 голосов
/ 13 декабря 2011

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

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

namespace DelegateApp
{
    delegate void GreeterDelegate();

    class Program
    {
        static void GreetGoodMorning()
        {
            if (DateTime.Now.ToString().EndsWith("AM"))
                Console.WriteLine("Good Morning!");
        }

        static void GreetGoodEvening()
        {
            if (DateTime.Now.ToString().EndsWith("PM"))
                Console.WriteLine("Good Evening!");
        }

        static void Main(string[] args)
        {
            GreeterDelegate Greeters = new GreeterDelegate(GreetGoodMorning);
            Greeters += GreetGoodEvening;

            Greeters();

            Console.ReadLine();
        }
    }
}

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

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

namespace DelegateApp
{
    delegate void GreeterDelegate();

    class Program
    {
        static void GreetGoodMorning()
        {
            Console.WriteLine("Good Morning!");
        }

        static void GreetGoodEvening()
        {
            Console.WriteLine("Good Evening!");
        }

        static void Main(string[] args)
        {
            GreeterDelegate Greeters;

            if (DateTime.Now.ToString().EndsWith("AM"))
                Greeters = new GreeterDelegate(GreetGoodMorning);
            else
                Greeters = new GreeterDelegate(GreetGoodEvening);

            Greeters();

            Console.ReadLine();
        }
    }
}

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

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Последний пример лучше, потому что у вас нет лишних проверок, которые используют метод + меньше вызовов.Это приведет к повышению производительности, поскольку проверка будет выполняться во время выполнения.

2 голосов
/ 13 декабря 2011

Это на самом деле не вопрос делегатов, а практика кодирования.

В вашем коде вы вызываете обоих делегатов, но только один отображает текст в консоли.

ВВ предлагаемом коде вызывается только один делегат.

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

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

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

1 голос
/ 13 декабря 2011

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

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

  • Методы, определяемые динамически во время выполнения (вызывается метод A, B или C)
  • Методы обратного вызова (позволяютукажите метод, который вызывается другим методом)
  • Многоадресные операции (методы A, B и C вызываются некоторым кодом X. X не имеет никакой информации о A, B или C)

Два образца не имеют одинакового значения.Я бы предпочел первую версию, потому что она делает то, что говорит.GreetGoodMorning проверяет, наступило ли утро или нет, и ничего не делает, когда это не так.Я бы переписал 2-ю версию следующим образом:

 static void Greet() 
 { 
    if (DateTime.Now.ToString().EndsWith("PM")) 
        Console.WriteLine("Good Evening!"); 
    else
        Console.WriteLine("Good Morning!"); 
 } 

Никто не должен писать какой-либо код только для использования делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...