c# - 我可以在函数内部声明一个函数指针吗?

标签 c# function-pointers

我对声明函数指针的 C# 方式感到困惑。我想在函数内声明一行一个函数指针变量,而不必添加类成员或类似的东西。

我正在尝试的是:

System.Func<KeyCode, bool> inputCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;

我也尝试过使用 Action(但显然它没有返回值)和 delegate,但显然我弄错了。

我能以某种方式做到这一点吗(即我只是弄错了语法),或者唯一的方法是先声明一个delegate 原型(prototype)?

编辑:澄清一下,目前我必须这样做:

    bool do_fire=false;
    if (activeCharacter.continuous_fire)
    {
        if (Input.GetKey( Fire ))
        {
            do_fire=true;
        }
    }
    else
    {
        if (Input.GetKeyDown( Fire ))
        {
            do_fire=true;
        }
    }

因为这看起来很糟糕和冗余(而且冗余几乎总是错误的),我只想将 Input.* 函数放在一个变量中并检查它。

伪代码:

    bool do_fire=false;
    function keyCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;
    if (keyCheck( Fire ))
    {
        do_fire=true;
    }

最佳答案

您的代码原则上可以工作,条件运算符只是无法确定“方法组”和“方法组”之间的公共(public)类型。这样做的原因是方法可能被重载(即使它们不是您的情况),因此可以有多个签名。

您可以通过将任一参数显式转换为目标委托(delegate)类型来解决此问题:

Func<KeyCode, bool> checkFire = activeCharacter.continuous_fire ?
        (Func<KeyCode, bool>)Input.GetKey : Input.GetKeyDown;

此外,即使在您引入了 inputCheck 之后,您的测试代码也不必要地复杂。不需要任何 if。而是直接分配 do_fire:

bool do_fire = checkFire(Fire);

附加说明:您的编码约定是一个困惑的组合,您应该清理它。 C# 通常对面向公众的标识符和所有类型使用 PascalCase,对其余类型使用 camelCasesnake_case 从未使用过。

换句话说,应该是:

  • activeCharacter.ContinuousFire
  • doFire
  • 开火

关于c# - 我可以在函数内部声明一个函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889159/

相关文章:

c# - 如何将时间四舍五入到最接近的 X 分钟?

c# - 从多个线程迭代一个不变的字典是否安全?

c - C 中的函数指针和指针参数

c++ - 被函数指针迷惑为类中另一个函数的参数

C++ P线程。 pthread_create 的参数

c# - 使用 streamreader 逐字符读取和输出文本文件

c# - 项目内的connectionString部署到云端时是否安全?

c# - 在 C# 中使用参数执行 Powershell 脚本

正确使用泛型函数指针

c - pthread_create 的正确参数是什么