Func <> и примитивный код - PullRequest
       2

Func <> и примитивный код

1 голос
/ 05 ноября 2010

Кто-нибудь знает, как объявлен исходный код для указателей Func и Action?Я пытаюсь понять теорию создания асинхронного вызова с использованием делегатов и как это связано с многопоточностью.

Например, если у меня есть код ниже:

    static void Main()
{
  Func<string, int> method = Work;
  IAsyncResult cookie = method.BeginInvoke ("test", null, null);
  //
  // ... here's where we can do other work in parallel...
  //
  int result = method.EndInvoke (cookie);
  Console.WriteLine ("String length is: " + result);
}

static int Work (string s) { return s.Length; }

КакЯ использую тип «делегат» для замены структуры Func <>;причина, по которой я хотел бы выяснить это, заключается в том, что Func может принимать только входную и возвращаемую переменные.Он не учитывает гибкость дизайна в методе, на который он указывает.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 05 ноября 2010

Func<T> ничего особенного, правда. Это просто:

public delegate T Func<T>();

На самом деле, для поддержки различного количества аргументов, есть несколько объявленных аргументов, например:

public delegate void Action();
public delegate void Action<T>(T arg);
public delegate U Func<T, U>(T arg);
// so on...
2 голосов
/ 05 ноября 2010

Func<int, string> - это просто общий делегат.Это просто поможет вам избежать написания общих делегатов.Вот и все.Если это не подходит для вас, напишите свой собственный delagate.для замены того, который вы запрашиваете, указывается

delegate string Method(int parm);

, если вы хотите, чтобы функция (для istance) принимала 22 :-) целое число и возвращала строку, которую вы должны написать, свой собственный делегат

delegate string CrazyMethod(int parm1,int parm2,.....)

В вашем случае

 delegate int MyOwnDeletage(string d);
    class Program
    {

        static int Work(string s) { return s.Length; }

        static void Main(string[] args)
        {

            //  Func<string, int> method = Work; 
            MyOwnDeletage method =Work;

              IAsyncResult cookie = method.BeginInvoke ("test", null, null); 
              // 
              // ... here's where we can do other work in parallel... 
              // 
              int result = method.EndInvoke (cookie); 
              Console.WriteLine ("String length is: " + result); 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...