что это за код: Func <T, string>, который я не понимаю - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть некоторый код (не написанный мной), который я не понимаю:

private Func<ControllerContext, string> ThemeSelector { get; set; }

Так что это не тип , это Func и я не знаю, как называется такая вещь, но я не могу найти некоторые объяснения в Google.Может ли кто-нибудь дать мне некоторые объяснения, дав мне ссылку для объяснения?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2012

Func<ControllerContext, string> - это особый тип универсального Func<T,K>.Прежде чем вы сможете полностью понять это, вам необходимо узнать об обобщениях.

Поэтому ThemeSelector - это просто свойство этого типа, которое имеет setter и getter.

Тип Func - это тип делегатакоторая представляет функцию, которая принимает один параметр типа T и возвращает экземпляр типа K.

Это означает, что вы можете назначить любую такую ​​функцию свойству.Например:

private string MyFunction(ControllerContext context) {
    return "Hello world!";
}

...

ThemeSelector = MyFunction;

Console.WriteLine(ThemeSelector(null));

напечатает "Hello world!"в консоли.

3 голосов
/ 04 февраля 2012

Это тип делегата, т.е. это свойство, и его можно установить.И его можно назвать методом.

например

/* Action<String> is a delegate, get it as an object*/
public void Foo (String[] arr, Action<String> instruction) {
    foreach (var element in arr) {
        //use it as a method
        instruction(element);
    }
}

РЕДАКТИРОВАТЬ

То же самое относится к Func

// Func<Int32, Boolean> means that this is a function which accepts one argument as an integer and returns boolean.
public void Foo(Int32 data, Int32 otherData, Func<Int32, Boolean> instruction) {
    var result1 = instruction(data);
    var result2 = instruction(data2);
    Console.WriteLine(result1==result2);
}

РЕДАКТИРОВАТЬ

Еще более подробный пример.

//This methods accepts the third parameter as a function with 2 input arguments of type
// Int32 and return type String
public static void DoSomething(Int32 data1, Int32 data2, Func<Int32, Int32, String> whatToDo) {
    var result = whatToDo(data1, data2);
    Console.WriteLine(result);
}

public static Main(String[] args) {
    // here we are calling the DoSomething and
    // passing the Concat method as if it was an object.
    DoSomething(1, 2, Concat);
    // The same with multiply concat.
    DoSomething(7, 2, MultiplyConcat);
}
public static String Concat(Int32 arg1, Int32 arg2) {
    return arg1.ToString() + " " + arg2.ToString():
}
public static String MultiplyConcat(Int32 arg1, Int32 arg2) {
    return (arg1 * arg2).ToString();
}
1 голос
/ 04 февраля 2012

Это тип! На самом деле это делегат типа. Он представляет метод, который можно использовать без явного объявления делегата.

Тип является универсальным типом. В вашем примере это тип Func<T, TResult>, который представляет метод, имеющий один параметр типа T и возвращающий значение типа TResult. В частности, в вашем примере он представляет метод с параметром ControllerContext и возвращает значение string:

string ThemeSelectorHandler(ControllerContext context) {
    returns context.ToString();
}

Дальнейшее чтение:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...