简而言之,关于Func 可以说些什么

我现在一直在看Func ,我已经设法避开它(现在)。 但是,现在看起来我无法永远避开它。 例如,我尝试了Dynamic Linq,但几乎所有内容都是以Func 为例。 我已经尝试了我的一本书(C#2008 / Deitel&Deitel)以及MSDN,但我还没有得到它。 他们都直接跳入主题。

  1. 关于Func ,可以说(用几句话)
  2. 我可以在网上获得一些可以让我开始这个问题的链接吗?

谢谢你的帮助

Func<>是一个通用委托 – 它使用起来非常方便,因为您不必为每个参数/返回类型组合创建自己的委托。
早些时候,你必须写下这样的东西:

 public delegate long MyDelegate( int number ); public void Method( IEnumerable list, MyDelegate myDelegate ) { foreach( var number in list ) { myDelegate( number ); } } 

您必须发布您的委托,以便用户可以正确调用您的方法。 特别是当你需要一堆不同的代表时,你最终会为每个参数列表和返回类型发布一个。
使用Func<>你只需写:

 public void Method( IEnumerable list, Func myDelegate ) { foreach( var number in list ) { myDelegate( number ); } } 

它与第一个代码示例相同 – Func定义一个委托,它接受一个整数参数并返回一个long值。

当然你也可以使用更长的参数列表: Func仍然会返回一个long值,而它需要两个整数和一个bool值。 如果您希望代理没有返回值,则必须使用Action<> ,它将返回类型为void

编辑 (按要求): 如何调用我的示例中的方法

对于调用者,使用MyDelegateFunc<>的解决方案没有区别。 在这两种情况下,他有三种方法可以调用该方法:

使用lambda表示法(需要C#3.0,可能是短方法的最佳解决方案):

 Method( myList, i => i * i ); 

通过使用匿名方法(需要C#2.0):

 Method( myList, delegate( int i ) { return i * i; } ); 

或者使用真实方法作为参数:

 Method( myList, Square ); private static long Square( int number ) { return number * number; } 

Func<...>是一个委托类型系列,它返回一些值,并获取一些参数; 例如:

  • Func只是接受一个int并返回一个bool(返回总是在结尾); 例如谓词:

     int[] data = {1,2,3,4,5}; var odd = data.Where(i => i % 2 == 0); 
  • Func是一个返回字符串的方法,例如() => "hello world";

  • Func可能类似于(when,howLong) => when + howLong;

同样, Action<...>执行相同但没有返回类型。

Func<...>没有什么神奇之处 – 它只是表达委托的一种更简单的方式,而a:使用generics(对LINQ有用),或者b:不需要你查找参数是什么; 如果委托类型是模糊的(例如PipeStreamImpersonationWorker ),则很难知道它需要什么; 如果将其表示为可比较的Action则很明显它不需要参数并且返回void

这可能有所帮助。 假设每次看到Func你都会想到自己:

 interface IFuncIntString { string Invoke(int x); } 

也就是说,委托是实现此接口的对象。 它有一个名为Invoke的方法,它接受一个int并返回一个字符串。

现在添加一个function,您可以在呼叫中省略“调用”,并且您自己就是一个委托。

Func (例如)是一种类型( string是一种类型)。 所以你用它来声明变量,字段,参数等。

它表示每当您要求答案时都可以执行的计算:

 Func f = () => DateTime.Now.Second; // elsewhere... Console.WriteLine( f() ); 

请注意如何像方法一样调用它。 有很多重载版本的Func来支持不同数量的参数。 最后一个类型参数是返回类型。

 Func quoteInt = n => "\"" + n + "\""; Console.WriteLine( quoteInt(3) ); 

Func是委托类型。 您可以声明自己的,但使用Func更容易。 如果要返回void ,请使用Action而不是Func 。 如果需要outref参数,则只需要声明自定义委托。

将lambda分配给Func ,可以引用局部变量。 这非常强大; 这意味着Func不仅仅是代码; 它有数据。 所以它就像一个具有单个方法的对象(从技术上讲它是 – 该方法称为Invoke ,当您调用委托时,编译器会隐式调用该方法)。

语法() =>可以放在任何表达式之前,说“现在不要这样做,将它延迟到以后”。 它允许您初始化捕获延迟计算的委托。 然后可以在委托之后放置syntax ()来实际触发计算。 所以suffix ()与prefix () =>相反。

您可以从101 Linq Samples开始。

简而言之, Func<>是一个委托,其中最后一个类型参数是返回类型。

因此, Func是一个委托,它接受一个int参数并返回一个bool

Func <...,T>是委托。 其中T是返回类型,其他所有 – 输入参数。

如果您曾经在c#中使用过=>运算符,而您可能已经使用过,那么您已经使用过Funcs。 你还没有明确地声明它们。

所以,如果你写一个类似的声明

 var peopleWhoLikeBlue = people.Where(person => person.FavoriteColor == "Blue"); 

你将Func传递给Where()方法。

如果你想要罗嗦,你可以像这样重写那句话:

 Func favoriteColorIsBlue = person => person.FavoriteColor == "Blue"; var peopleWhoLikeBlue = people.Where(favoriteColorIsBlue); 

你会得到相同的结果。