如何使用 Func<>和动作>>设计应用程序时?
我能找到的关于 Func<> 的所有例子和动作>>很简单,如下所示,您可以在其中看到它们在技术上如何工作,但我希望看到它们在示例中使用,以解决以前无法解决或可以解决的问题只能以更复杂的方式解决,即我知道它们是如何工作的,并且我可以看到它们简洁而强大,所以我想从更大的意义上理解它们它们解决了哪些类型的问题以及我如何在应用程序设计中使用它们。
您以什么方式(模式)使用 Func<>和动作>>解决实际问题?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestFunc8282
{
class Program
{
static void Main(string[] args)
{
//func with delegate
Func<string, string> convert = delegate(string s)
{
return s.ToUpper();
};
//func with lambda
Func<string, string> convert2 = s => s.Substring(3, 10);
//action
Action<int,string> recordIt = (i,title) =>
{
Console.WriteLine("--- {0}:",title);
Console.WriteLine("Adding five to {0}:", i);
Console.WriteLine(i + 5);
};
Console.WriteLine(convert("This is the first test."));
Console.WriteLine(convert2("This is the second test."));
recordIt(5, "First one");
recordIt(3, "Second one");
Console.ReadLine();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
它们对于重构 switch 语句也很方便。
采取以下(虽然简单)示例:
使用 Action 委托,您可以按如下方式重构它:
They're also handy for refactoring switch statements.
Take the following (albeit simple) example:
With an Action delegate, you can refactor it as follows:
使用 linq。
Where
的参数是Func
。Lambda 表达式是我最喜欢的 C# 部分之一。 :)
Using linq.
The parameter for
Where
is anFunc<int, bool>
.Lambda expressions are one of my favorite parts of C#. :)
我一直使用
Action
和Func
委托。我通常使用 lambda 语法声明它们以节省空间,并主要使用它们来减少大型方法的大小。当我检查我的方法时,有时相似的代码段会脱颖而出。在这些情况下,我将类似的代码段包装到Action
或Func
中。使用委托可以减少冗余代码,为代码段提供良好的签名,并且在需要时可以轻松提升为方法。我曾经编写过 Delphi 代码,您可以在函数中声明函数。 Action 和 Func 在 C# 中为我完成了同样的行为。
以下是使用委托重新定位控件的示例:
I use the
Action
andFunc
delegates all the time. I typically declare them with lambda syntax to save space and use them primarily to reduce the size of large methods. As I review my method, sometimes code segments that are similar will stand out. In those cases, I wrap up the similar code segments intoAction
orFunc
. Using the delegate reduces redundant code, give a nice signature to the code segment and can easily be promoted to a method if need be.I used to write Delphi code and you could declare a function within a function. Action and Func accomplish this same behavior for me in c#.
Here's a sample of repositioning controls with a delegate:
我使用它的一件事是缓存昂贵的方法调用,这些方法调用在给定相同输入的情况下永远不会改变:
默认递归斐波那契示例:
One thing I use it for is Caching of expensive method calls that never change given the same input:
The default recursive fibonacci example:
不知道回答同一个问题两次是否是一种不好的形式,但为了获得一些更好地使用这些类型的想法,我建议阅读 Jeremy Miller 的关于函数式编程的 MSDN 文章:
日常 .NET 开发的函数式编程
Dunno if it's bad form to answer the same question twice or not, but to get some ideas for better uses of these types in general I suggest reading Jeremy Miller's MSDN article on Functional Programming:
Functional Programming for Everyday .NET Development
我使用 Action 很好地封装了在事务中执行数据库操作:
现在要在事务中执行,我只需执行
InTran 类可以驻留在公共库中,从而减少重复并为将来的功能调整提供单一位置。
I use an Action to nicely encapsulate executing database operations in a transaction:
Now to execute in a transaction I simply do
The InTran class can reside in a common library, reducing duplication and provides a singe location for future functionality adjustments.
通过保持它们的通用性并支持多个参数,它使我们能够避免创建强类型委托或执行相同操作的冗余委托。
By keeping them generic and supporting multiple arguments, it allows us to avoid having to create strong typed delegates or redundant delegates that do the same thing.
实际上,我在 stackoverflow 上发现了这个(至少是这个想法):
Actually, i found this at stackoverflow (at least - the idea):
我有一个单独的表单,它接受构造函数中的通用 Func 或 Action 以及一些文本。它在单独的线程上执行 Func/Action,同时在表单中显示一些文本并显示动画。
它位于我的个人 Util 库中,每当我想要执行中等长度的操作并以非侵入式方式阻止 UI 时,我都会使用它。
我考虑过在表单上放置一个进度条,以便它可以执行更长时间的运行操作,但我还没有真正需要它。
I have a separate form that accepts a generic Func or an Action in the constructor as well as some text. It executes the Func/Action on a separate thread while displaying some text in the form and showing an animation.
It's in my personal Util library, and I use it whenever I want to do a medium length operation and block the UI in a non-intrusive way.
I considered putting a progress bar on the form as well, so that it could perform longer running operations but I haven't really needed it to yet.