Luc*_*hez 19 c# types function
我想知道在C#中是否存在类似于AS3的Function类型.我想做这样的somnthing(但在C#中):
private function doSomething():void {
// statements
}
var f:Function = doSomething
f()
Run Code Online (Sandbox Code Playgroud)
ang*_*son 36
是的,它们在.NET中被称为委托,而不是函数类型.
您可以使用保留关键字delegate来定义新关键字,并且在类库中预定义了很多.
要定义与您的示例匹配的一个:
public delegate void DoSomethingDelegate(Object param1, Object param2);
Run Code Online (Sandbox Code Playgroud)
然后分配它:
DoSomethingDelegate f = DoSomething;
f(new Object(), new Object());
Run Code Online (Sandbox Code Playgroud)
在基类库中还定义了两种通用类型的委托类型,一种用于返回值的方法,另一种用于不返回值的方法,并且它们具有您拥有的参数数量的变体.
这两个Func<..>用于返回值Action<..>的方法,而用于不返回值的方法.
在你的情况下,这将工作:
Action<Object, Object> f = DoSomething;
f(new Object(), new Object());
Run Code Online (Sandbox Code Playgroud)
请注意,在最后一种情况下,您不必声明DoSomethingDelegate.
它们(对函数的引用)称为委托
这是一本很棒的入门书:http://www.akadia.com/services/dotnet_delegates_and_events.html
是的,有一些名为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
}
Run Code Online (Sandbox Code Playgroud)
Action<T> 是内置的代表......
public delegate void Action<T1, T2>(T1 arg1, T2 arg2)
Run Code Online (Sandbox Code Playgroud)
还有一些名为Lambda Expressions的匿名函数.例如 ...
List<int> lst = new List<int>() { 1, 2, 3, 4, 5 };
var res = lst.Where( l => l > 3 );
Run Code Online (Sandbox Code Playgroud)
Where方法的参数是Lambda表达式.查看Eric White的博客,对这些内容进行了很好的讨论:使用C#3.0中的函数编程技术进行查询组合.