C#中有函数类型吗?
Posted
技术标签:
【中文标题】C#中有函数类型吗?【英文标题】:Is there a Function type in C#? 【发布时间】:2010-11-21 17:57:03 【问题描述】:我想知道在 C# 中是否有类似 AS3 的 Function 类型。我想做这样的事情(但在 C# 中):
private function doSomething():void
// statements
var f:Function = doSomething
f()
【问题讨论】:
【参考方案1】:是的,它们在 .NET 中被称为委托,而不是函数类型。
您使用保留关键字delegate
来定义新的,类库中有很多预定义的。
定义一个与您的示例匹配的:
public delegate void DoSomethingDelegate(Object param1, Object param2);
然后分配它:
DoSomethingDelegate f = DoSomething;
f(new Object(), new Object());
在基类库中还定义了两种通用类型的委托类型,一种用于返回值的方法,另一种用于不返回值的方法,它们会根据您有多少参数而有所不同。
这两个是 Func<..>
用于返回值的方法,Action<..>
用于不返回值的方法。
在你的情况下,这会起作用:
Action<Object, Object> f = DoSomething;
f(new Object(), new Object());
请注意,在最后一种情况下,您不必声明 DoSomethingDelegate
。
【讨论】:
Func 和 Action 在 Linq 中被大量使用。 问题是无法创建自己的 Func 实现,所以很遗憾,这并不能完全解决问题。【参考方案2】:.NET 中的delegates 概念正是您所寻找的。
链接页面上有示例,以及许多教程以及如何实现和使用它们的深入解释。谷歌离开!
【讨论】:
【参考方案3】:它们(对函数的引用)被称为委托
这是一本精彩的入门书:http://www.akadia.com/services/dotnet_delegates_and_events.html
【讨论】:
它们是后台的完整类,构造函数接受一个函数,但 C# 2 和 3 完全消除了这一事实,这是一件好事。【参考方案4】:是的,有称为Delegates 的类型安全函数指针。比如……
void Main()
object o1 = new object();
object o2 = new object();
Action<object, object> act = DoSomething;
act( o1, o2 );
private void DoSomething( object o1, object o2 )
// do that thang
Action<T>
是内置委托...
public delegate void Action<T1, T2>(T1 arg1, T2 arg2)
还有称为Lambda Expressions 的匿名函数。比如……
List<int> lst = new List<int>() 1, 2, 3, 4, 5 ;
var res = lst.Where( l => l > 3 );
Where 方法的参数是一个 Lambda 表达式。查看 Eric White 的博客,了解有关这些内容的精彩讨论:Query Composition Using Functional Programming Techniques in C# 3.0。
【讨论】:
【参考方案5】:我认为您正在寻找 C# 委托类型。
delegate void DoSomethingDelegate(object obj1, object obj2);
void DoSomething(object a, object b)
void RunDoSomething()
//use your delegate
DoSomethingDelegate d = new DoSomethingDelegate(DoSomething);
d(new object(), new object());
//alernatively, use the built in generic version
Action<object, object> d2 = new Action<object, object>(DoSomething);
d2(new object(), new object());
【讨论】:
以上是关于C#中有函数类型吗?的主要内容,如果未能解决你的问题,请参考以下文章