Создать функцию с подсчетом вызовов - C#

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

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

В общем, примитивная задача, решил её таким образом:
using System;
 
namespace ConsoleApplication43
{
    class Program
    {
        static void Main()
        {
            var func = new FunctionWithCounter<double, double>(x => x*x);
            for (int i = 0; i < 5; i++)
                Console.WriteLine(func.Apply(i));
            Console.WriteLine("Count of calls = {0}", func.Calls.ToString());
            Console.ReadKey();
        }
    }
 
    class FunctionWithCounter<T,TResult>
    {
        private readonly Func<T, TResult> func;
        public int Calls { get; private set; }
 
        public FunctionWithCounter(Func<T, TResult> func)
        {
            Calls = 0;
            this.func = func;
        }
 
        public TResult Apply(T parameter)
        {
            Calls++;
            return func(parameter);
        }
    }
}
Но очень многословный синтаксис вызова func.Apply(x) хотелось бы что-нибудь вроде func(x). Да и все методы куда-то деваются, но в таком случае пропадают все методы класса Func. Хотел наследовать, но он оказался sealed. Как быть? Хотел инкапсулировать вызовы в самой функции, но вот не очень получается

Решение задачи: «Создать функцию с подсчетом вызовов»

textual
Листинг программы
 static void Main(string[] args)
        {
            Func<int, int> func = x => x*x;
            Func<int, int> func1 = x => x + x;
            Functor<int, int, bool>.RegisterFunc(ref func);
            Functor<int, int, object>.RegisterFunc(ref func1);
            for(int i = 0  ; i< 10; ++i)
            {
                func(4);
            }
            func1(5);
            Console.WriteLine(Functor<int, int, bool>.Count);
            Console.WriteLine(Functor<int, int, object>.Count);
            Console.ReadKey();
        }
 
        public class Functor<T1, T2, Fake>
        {
            static Functor()
            {
                Count = 0;
            }
 
            public static void RegisterFunc(ref Func<T1, T2> func)
            {
                Count = 0;
                Func<T1, T2> func1 = func;
                func = t1 => { ++Count; return func1(t1); };
            }
 
            public static int Count { get; private set; }
        }

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


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

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

5   голосов , оценка 4.2 из 5
Похожие ответы