在一行中声明和定义一个委托(不使用 Action/Func)

Posted

技术标签:

【中文标题】在一行中声明和定义一个委托(不使用 Action/Func)【英文标题】:Declare and define a delegate in one line (without using Action/Func) 【发布时间】:2016-09-04 10:57:46 【问题描述】:

有没有办法缩短以下内容:

public class Test

    /* declares a delegate type (named MyDelegateType) which has a single parameter of 
        type float and doesn't return anything. */
    public delegate void MyDelegateType(float f); 

    /* defines a reference to an object of type MyDelegateType */                                                
    private MyDelegateType MyDelegateRef;

    ... // say we have a Property to set and get MyDelegateRef, and a method
        // for executing its target

成一行,不使用 Action/Func 类型?

我想了解是否有与我们在 C++(或 C)中可以使用函数指针执行的操作的等效项:

class Test

   /* defines a pointer (named MyFP) to a function with a single 
      parameter of type float, and doesn't return anything */
   void(*MyFP)(float); 

   ... // say we have a Setter & Getter functions, and an Execute 
       // function for executing MyFP

【问题讨论】:

你为什么不想要一个“Func”?据我所知,C++ 知识非常有限,函数指针也是某种“Func”类型。 为什么没有那些能满足你需求的类型? @ThomasSchremser,函数指针可以用作 ActionFunc 类型。不是我不想要Action/Func,这个问题纯粹是为了理解句法的可能性。 C# 语言通常不允许在声明该类型对象的同一语句中声明一个类型。在 C++ 中工作,但很难诊断编译器错误的永无止境的来源,特别是如果声明位于头文件中并且右大括号后缺少分号。每个人都忘记了。 C# 团队由非常有经验的程序员组成,他们非常了解 C++,包括所有的陷阱。并旨在避免它们。使用 Func 类型是可行的,因为该类型当然已经声明了。你会很容易习惯的。 只是添加此作为相关参考:Eric Lippert 的 post 关于(不)支持 C# 中的函数指针 【参考方案1】:

不,这就是框架中包含 Action<T>Func<T> 的原因。

【讨论】:

以上是关于在一行中声明和定义一个委托(不使用 Action/Func)的主要内容,如果未能解决你的问题,请参考以下文章

通俗的理解委托

C# Action用法

委托delegate,Action,Func,Predicate

Action执行与Delegate的差异,调用方法

编写高质量代码改善C#程序的157个建议——建议36:使用FCL中的委托声明

163-委托的定义和声明