Объяснение Func


мне было интересно, если кто-то может объяснить, что Func<int, string> есть и как он используется с некоторыми четкими примерами.

4 79

4 ответа:

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

Func<T, TResult> это просто общий делегат-выясните, что это значит в любой конкретной ситуации, заменив параметры типа (T и TResult) с соответствующими аргументы типа (int и string) in декларация. Я также переименовал его, чтобы избежать путаницы:

string ExpandedFunc(int x)

другими словами, Func<int, string> является делегатом, который представляет функцию, принимающую

A Func<int, string> ест ints и возвращает строки. Итак, что ест ints и возвращает строки? Как насчет этого?..

public string IntAsString( int i )
{
  return i.ToString();
}

там, я только что составил функцию, которая ест ints и возвращает строки. Как бы я его использовал?

var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;

foreach( int i in lst )
{
  str += IntAsString(i);
}

// str will be "12345"

не очень сексуально, я знаю, но это простая идея, на которой основано много трюков. Теперь, давайте использовать функцию вместо этого.

Func<int, string> fnc = IntAsString;

foreach (int i in lst)
{
  str += fnc(i);
}

// str will be "1234512345" assuming we have same str as before

вместо вызова IntAsString на каждом члене, я создал ссылку на него под названием fnc (эти ссылки на методы называются представители) и использовал его. (Помните, что fnc ест ints и возвращает строки).

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

один из лучших праймеров на этом материале я видел это здесь. У него есть гораздо больше реальных примеров. :)

- Это делегат, который принимает один int в качестве параметра и возвращает значение типа string.

вот пример его использования:

using System;

class Program
{
    static void Main()
    {
        Func<Int32, String> func = bar;

        // now I have a delegate which 
        // I can invoke or pass to other
        // methods.
        func(1);
    }

    static String bar(Int32 value)
    {
        return value.ToString();
    }
}

Func<int, string> принимает параметр int value и возвращает строковое значение. Вот пример, где дополнительный метод поддержки не нужен.

Func<int, string> GetDogMessage = dogAge =>
        {
            if (dogAge < 3) return "You have a puppy!";
            if (dogAge < 7) return "Strong adult dog!";

            return "Age is catching up with the dog!";
        };

string youngDogMessage = GetDogMessage(2);

Примечание: последний тип объекта в Func (т. е. "строка" в этом примере) является типом возвращаемых функций (т. е. не ограничивается примитивами, но любым объектом). Таким образом, Func<int, bool, float> принимает параметры int и bool value и возвращает значение с плавающей запятой.

Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
        {
            if(intValue > 100 && boolValue) return 100;

            return 1;
        };
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);

HTH