Func 代表现实世界使用

| 我最近一直在与委托
Func<T, TResult>
玩耍,并创建返回包含lambda的不同实例
Func<T, TResult>
的方法,但我一直想出的是现实世界中关于为什么要返回(甚至创建这样的一个)的好主意。实例)。 在MSDN上有一个示例,他们执行以下操作...
Func<string, string> convertMethod = UppercaseString;
private static string UppercaseString(string inputString)
{
    return inputString.ToUpper();
}
尽管它看起来很漂亮并且是一个有趣的概念,但我仍然看不到此类代码具有什么优势。 因此,这里有人可以提供任何必须使用ѭ0的真实示例吗,总的说来为什么要使用此委托?     
已邀请:

bab

        如果您真正要问的是为什么我们通常会有代表: 如果您曾经使用过某个事件,那么您已经使用了一个委托 如果您曾经使用过LINQ,那么您已经使用了一个委托(从技术上讲,使用
IQueryable
提供程序时,您已经使用了表达式,但是对于LINQ-to-Objects,您已经使用了委托) 委托提供了一种将自己的行为注入另一个对象的方法。最常见的用法是事件。一个对象公开一个事件,并且您提供一个函数(无论是否匿名)在该事件触发时被调用。 如果您要问为什么要有
Func<T, TResult>
(和类似的代表),则有两个主要原因: 人们在代码中需要特定的委托人时,必须声明自己的简单委托人类型。尽管
Action<>
Func<>
代表不能涵盖所有情况,但它们很容易提供并涵盖了许多需要自定义代表的情况。 更重要的是,“ 0”委托在LINQ-to-Objects中广泛用于定义谓词。更具体地说,
Func<T, bool>
。这使您可以定义一个谓词,该谓词采用
IEnumerable<T>
的强类型成员,然后使用lambda或普通函数返回布尔值,然后将该谓词传递给LINQ-to-Objects。     
        您将在LINQ中大量使用它。因此,例如,将列表中的所有数字加倍:
myList.Select(x => x * 2);
那是12英镑。在创建简洁的代码时,这非常有用。一个真实的例子是我做过的许多塔防游戏之一,我用一条线计算了最接近塔的敌人:
enemies.Select(x => tower.Location.DistanceTo(x.Location)).OrderBy(x => x).FirstOrDefault();
    
        我认为一个很好的例子是延迟初始化。
var value = new Lazy<int>(() => ExpensiveOperation()); // Takes Func<T>
    
        需要函数指针的典型示例是将比较函数传递给排序例程。为了具有不同的排序键,您可以为比较函数创建一个lambda,并将其传递给sort函数。 或举一个简单的实际例子:
IEnumerable<Person> FindByLastName(string lastName)
{
    return Customers.Where(cust => cust.LastName == lastName);
}
在此示例中,
cust => cust.LastName == lastName
不仅是lambda,而且还通过捕获
lastName
参数创建了一个闭包。换句话说,它创建一个函数,每次调用
FindByLastName
都会不同。     
        
Func<T>
委托(以及其他重载)为您提供了用C#编写抽象的新方法。为了演示一些选项,这里有一些C#语言构造,可以使用委托编写:
Thread.Lock(obj, () => { 
    // Safely access \'obj\' here
});

Enumerable.ForEach(collection, element => {
    // Process \'element\'
});

Exceptions.Try(() => { 
    // Try block
}).With((IOException e) => {
    // Handle IO exceptions
});
这些是非常原始的,因此最好为它们使用语言构造。但是,它表明
Func
和lambda表达式增加了相当多的表达能力。这样就可以编写新的结构,例如并行循环(使用.NET 4.0):
Parallel.ForEach(collection, element => {
    // Process \'element\'
});
    
        首先,“ 19”不是一个类,它是一个委托。 基本上,如果您不想为此声明自己的委托,则可以在需要方法参数或委托类型的属性时使用它。     
        除了可以将ѭ24great嵌入许多框架(例如LINQ,Mocking Tools和Dependency Injection容器)外,它的一个很好的用途就是使用它来创建基于委托的工厂。     
最近,我希望调用我的方法的外部程序能够修改其行为方式。 我的方法本身只是将文件从XLS转换为XML。但是有必要允许调用代码指定是否需要任意数量的转换,这些转换应在作为xml标记写入之前应用于每个xls单元。例如:将\“,\”小数点分隔符转换为\“。\”,取消千位分隔符,依此类推(转换都是字符串替换)。 然后,调用者代码只需要在字典中添加任意数量的条目,其中键是模式,值是该模式的替换字符串。我的方法遍历字典并为每个条目创建一个新的25。然后,对每个单元依次应用“ 25”。     

要回复问题请先登录注册