Может кто-нибудь объяснить, что делает 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> 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);