lic*_*ice 0 c# python methods anonymous-methods
好的,在python中可以这样做:
def foo(monkeys):
def bar(monkey):
#process and return new monkey
processed_monkeys = list()
for monkey in monkeys:
processed_monkeys += bar(monkey)
return processed_monkeys
Run Code Online (Sandbox Code Playgroud)
(这只是一个愚蠢的例子)我有时会错过在c#中另一个方法中声明一个方法的功能.但今天我有以下想法来完成这个:
List<Monkey> foo(List<Monkey> monkeys)
{
Func<Monkey, Monkey> bar = delegate(Monkey monkey)
{
//process and return new monkey
}
List<Monkey> processed_monkeys = new List<Monkey>(monkeys.Count);
foreach(Monkey monkey in monkeys)
processed_monkeys.Append(bar(monkey));
return processed_monkeys;
}
Run Code Online (Sandbox Code Playgroud)
显然,变通方法不提供与原始功能完全相同的功能,因为Func或Action Delegates限制为4个参数,但很少需要4个以上的参数......
你对此有何看法?
这是邪恶的,应该避免除了非常特殊的情况吗?
这个表现如何?每次调用函数时都会创建一个新的bar函数,还是编译器会以某种方式优化它?
......因为Func或Action Delegates限制为4个参数......
从.NET 4.0开始,这些委托类型最多可以定义为17个参数.您也可以非常简单地为任意数量的参数定义自己的参数; 例如,下面我定义了一个带有5个参数的委托:
public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
Run Code Online (Sandbox Code Playgroud)
你对此有何看法?
这完全没问题.信不信由你,.NET开发人员一直这样做.
这是邪恶的,应该避免除了非常特殊的情况吗?
不,这是非常温和的.这真的没有害处.
这个表现如何?每次调用函数时都会创建一个新的bar函数,还是编译器会以某种方式优化它?
表现非常好.编译器将定义一个实际的完整CLR类型来提供匿名方法,就像它为匿名类型和使用该yield关键字的方法定义完整的CLR类型一样.别担心; 匿名方法不会在每次调用时产生动态编译!真的,如果你考虑一下,这将是非常荒谬的.
这甚至不是我称之为"优化"的东西; 它只是编译器实现匿名方法的方式.