dmc1989
@dmc1989

Как передать функцию в c#?

Пытаюсь передать функцию не немножко не понимаю как правильно такое делать:
namespace coordinates
{
    class Example
    {
        public string name;
        public Delegate mainFunc;

        public Example(string name, Delegate callback)
        {
            this.name = name;
            this.mainFunc = callback;
        }

        public void init()
        {
            this.mainFunc();
        }
    }
}
  • Вопрос задан
  • 1497 просмотров
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
namespace coordinates
{
    class Example
    {
        public string Name;
        public Action MainFunc;

        public Example(string name, Action callback)
        {
            Name = name;
            MainFunc = callback;
        }

        public void Init()
        {
            MainFunc?.Invoke();
        }
    }
}

var r = new Example("Example name", () => Console.WriteLine("Example MainFunc"));
Ответ написан
Комментировать
@basrach
Delegate (с большой буквы) - это статический класс, которые содержит методы для работы с делегатами. Сам же делегат нужно объявить через ключевое слово delegate (с маленькой буквы), как класс или интерфейс. Например:
public delegate void TestDelegate(string message);
При этом использовать вы можете только конкретный тип делегата, точно также как вы используете конкретный MyClassи т.п., а не само ключевое слово class. В приведенном примере тип делегата будет TestDelegate. Чтобы передать с помощью делегата ссылку на функцию, сигнатуры функции и делегата должны полностью совпадать. В случае приведенного примера TestDelegate, функция должна также возвращать voidи принимать string.

В вашем случае тип делегата должен быть такой: public delegate void MyDelegate(); Этому делегату вы можете присвоить ссылку на ваш метод void init().
Но свой тип делегаты в данном случае объявлять нет необходимости. В Net. Framework уже есть целый ряд делегатов, как раз для таких целей. Это Func и Action.
Вы можете просто заменить слово Delegate на Actionв вашем коде, и всё должно работать.
Ответ написан
Комментировать
cjstress
@cjstress
C#
using System;

namespace TOSTER
{
    class Program
    {
        static void Main(string[] args)
        {
            var example = new Example("example 1", () => { return "Result"; });
            var result = example.init();
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

    class Example
    {
        private readonly string _name;
        private readonly Func<string> _del;

        public Example(string name, Func<string> callback)
        {
            _name = name;
            _del = callback;
        }

        public string init()
        {
            return _del.Invoke();
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы