比较C#中的委托和Ruby中的block对象
Ruby中,所谓带块(block)的方法是指对控制结构的抽象,最初设计是用于对循环进行抽象,所以又称迭代器。
语法:method_name do...end 或 method_name {}
1
#块调用
2
def foo
3
print yield(5)
4
end
5![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
foo {|a|
7
if a > 0
8
"positive"
9
elsif a < 0
10
"negative"
11
else
12
"zero"
13
end
14
}
15![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
foo()
17![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
#使用了proc(过程对象)的块调用
19
quux = proc {|a|
20
if a > 0
21
"positive"
22
elsif a < 0
23
"negative"
24
else
25
"zero"
26
end
27
}
28![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
def foo(p)
30
print p.call(5)
31
end
32![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
foo(quux)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
1
//传统委托
2
public delegate string fooDelegate(int a);
3
public string foo(int a)
4
{
5
if(a > 0)
6
return "positive";
7
else if(a < 0)
8
return "negative";
9
return "zero";
10
}
11
fooDelegate myD1 = new fooDelegate(foo);
12
Console.WriteLine(myD1(5));
13![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
//匿名委托 C# 2.0
15
public delegate string fooDelegate(int a);
16
fooDelegate myD1 = delegate(int a)
17
{
18
if(a > 0)
19
return "positive";
20
else if(a < 0)
21
return "negative";
22
return "zero";
23
}
24
Console.WriteLine(myD1(5));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Action/Func委托 + lambda表达式 C# 3.0 Action<Func<int, string>> foo = (func)=>{ Console.WriteLine(func(5)); }; Action qoo = () => { foo((a) => { if(a > 0) return "positive"; else if(a < 0) return "negative"; return "zero"; }); }; qoo(); Func<int, string> quux = (a) =>{ if(a > 0) return "positive"; else if(a < 0) return "negative"; return "zero"; }; Action<Func<int, string>> foo = (func)=>{ Console.WriteLine(func(5)); }; foo(quux);