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&lt;T&gt; 是内置委托...

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#中有函数类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

C#使用Win32函数的一些类型转换

C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

Mysql中有类似merge into这种函数吗

python中有函数重载吗

C语言中有Bool类型吗

Mysql中有类似merge into的函数吗?