Указатели на функции в C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте!\n На вход программе подаётся массив в некотором формате, каждый элемент массива -по сути функция, которая в качестве входного параметра принимает 2 значения типа bool, и, произведя некоторую несложную арифметику выводит значение типа bool, входными значениями этих функций могут быть либо входной параметр извне, либо результат работы аналогичной функции, соответственно выход может осуществляться либо в функцию, либо во вне. собственно, для простоты исполнения, я выбрал исходный массив -массив интов, каждое число которого отображает связь функции с другими (функций, соответственно, немного)\n В качестве реализации, я хотел сделать соответствующий массив структур, содержащих указателей на функции и связей (откуда и куда), затем, задать каждой из этих структур откуда принимать и куда посылать значения, сделав это инициализацией соответствующих полей структуры, а после запускать поочерёдно только те, выходные значения которых идут во вне.(кстати, простите, что не сказал раньше -суть в том, чтобы в конце получить все выходные значения). Но к сожалению, я не владею языком в достаточной мере, чтобы это реализовать и не знаю практически ничего о указателях на функции в c#, или о продвинутой работе с делегатами, и вообще я только начинаю осваивать этот язык, так что, хотелось бы послушать как это лучше реализовать или как реализовать то что я написал, желательно с максимально большой степенью практического кода (но не прошу написать всё за меня, не подумайте.)

Решение задачи: «Указатели на функции в C#»

textual
Листинг программы
using System;
 
namespace BoolsTest
{
    delegate bool LOGIC_FUNC_DELEGATE(bool op1, bool op2);    
 
    class Program
    {
        static LOGIC_FUNC_DELEGATE andFunc => (op1, op2) => op1 & op2;
        static LOGIC_FUNC_DELEGATE orFunc => (op1, op2) => op1 | op2;
        static LOGIC_FUNC_DELEGATE xorFunc => (op1, op2) => op1 ^ op2;
 
        static void Main(string[] args)
        {
            var tree = new Node(andFunc);
 
            tree.Left = new Node(true);
            tree.Right = new Node(orFunc);//как видно из дерева - замена на andFunc должна изменить результат
 
            var right = tree.Right;
            right.Left = new Node(false);
            right.Right = new Node(xorFunc);
 
            right = right.Right;
            right.Left = new Node(false);
            right.Right = new Node(true);
 
            var result = tree.Evaluate();
 
            Console.WriteLine(result);
 
            Console.ReadKey();
        }
    }
 
    class Node
    {
        bool? _value;
        LOGIC_FUNC_DELEGATE _function;        
 
        public Node Left { get; set; }
        public Node Right { get; set; }
 
        public Node(object item)
        {
            if (item is bool)
                _value = item as bool?;
            else
                _function = item as LOGIC_FUNC_DELEGATE;
        }
 
        public bool Evaluate()
        {
            if (_value != null)
                return (bool)_value;
            else
                return _function(Left.Evaluate(), Right.Evaluate());
        }       
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5