Может кто-нибудь объяснить, что делает C# "Func"?

Я читаю книгу Pro MVC 2, и есть пример создания метода расширения для класса HtmlHelper.

вот пример кода:

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl)
{
    //Magic here.
}

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

[Test]
public void Can_Generate_Links_To_Other_Pages()
{
    //Arrange: We're going to extend the Html helper class.
    //It doesn't matter if the variable we use is null            
    HtmlHelper html = null;

    PagingInfo pagingInfo = PagingInfo(){
        CurrentPage = 2,
        TotalItems = 28,
        ItemsPerPage = 10
    };

    Func<int, String> pageUrl = i => "Page" + i;

    //Act: Here's how it should format the links.
    MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl);

    //Assert:
    result.ToString().ShouldEqual(@"<a href=""Page1"">1</a><a href=""Page2"">2</a><a href=""Page3"">3</a>")           

}

Edit: удалена часть, которая запутала точка этого вопроса.

вопрос: почему в примере используется Func? Когда я должен использовать его? Что такое функция?

спасибо!

8 ответов


A Func<int, string> как

Func<int, String> pageUrl = i => "Page" + i;

делегат принимает int в качестве единственного параметра и возвращает string. В этом примере, он принимает


Func<int, String> означает, что метод обратного вызова, который принимает


на Func<int, string> строка, о которой вы спрашиваете, известна как лямбда-выражение.

Func<int, String> pageUrl = i => "Page" + i;

эту строку можно описать как функцию, которая принимает параметр int (i) и возвращает строку "Page" + i;

его можно переписать как:

delegate(int i)
{
    return "Page" + i;
}

потому что PageLinks метод Метод Расширения.

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

на Func<T1, T2> - делегат, представляющий преобразование из типа T1 типа T2. Итак, твой PageLinks метод применить это преобразование к int для производства string.


Func<T, TResult>: инкапсулирует метод с одним параметром и возвращает значение типа, заданного параметром TResult. смотрите эту страницу для получения более подробной информации и примеры. :-)


есть сообщение в блоге об этом. Используя Func вы можете устранить некоторые функциональные несоответствия. Читать здесь.


я реализовал метод расширения where () с помощью Func, пожалуйста, посмотрите...

public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method )
{

    foreach ( var data in a )
    {
        //If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return)
        if ( Method.Invoke ( data ) )
        {
            yield return data;
        }
    }
}

Вы можете использовать его как

        foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) )
        {
            Console.WriteLine ( item );
        }

создать свой собственный

Func<int,string> myfunc; 

затем щелкните правой кнопкой мыши Func для просмотра определения. Вы увидите, что это делегат underneith

public delegate TResult Func<in T, out TResult>(T arg);