上午来到实验室,打开VS 2008,看了看Start Page中RSS的一些文章,其中有一篇讲使用多种语言实现Fibonacci函数的post,包括比较了C# 2.0与C# 3.0在实现上的不同。
Post中提供了两种写法,首先是C# 2.0的
static
int
Fibonacci (
int
x)
{
if (x <= 1 )
return 1 ;
return Fibonacci (x - 1 ) + Fibonacci (x - 2 );
}
{
if (x <= 1 )
return 1 ;
return Fibonacci (x - 1 ) + Fibonacci (x - 2 );
}
然后给出了使用C# 3.0的新泛型委托Func<>以及Lambda表达式的写法,看了这个的人不会觉得C#像Java吧
Func
<
int
,
int
>
fib
=
null
;
fib = (n => n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n);
fib = (n => n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n);
其实我们也可以定义自己的Func<>,like this
public
delegate
TResult SingleParmFunction
<
Tin, TResult
>
(Tin input);
这个定义正如同单参数的Func<>版本,于是同样可以定义出一个Fibonacci的函数
SingleParmFunction
<
int
,
int
>
fib
=
null
;
fib = (n => n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n);
fib = (n => n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n);
不过看明白了C# 3.0 Lambda表达式本质的人就应该知道其实C# 2.0完全不用写得如post中那样ws,使用匿名委托一样可以写得很精干,这里我还是用的自己定义的委托
SingleParmFunction
<
int
,
int
>
fib
=
null
;
fib = delegate ( int n)
{
return n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n;
};
fib = delegate ( int n)
{
return n > 1 ? fib(n - 1 ) + fib(n - 2 ) : n;
};
相比较Lambda表达式,匿名委托只是还像一个我们都熟悉的method的定义,有括号,括号里头有参数,要使用return返回方法的执行结果,如此而已。
对我提到的那篇post有兴趣的,可以点击 http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx