【问题标题】:as3 to c# porting a function within function?as3 到 c# 在函数中移植函数?
【发布时间】:2015-03-10 21:52:24
【问题描述】:

我正在尝试将一些 AS3 代码移植到 C#(.NET) 中,其中大部分已经完成 (90%) 但是我在函数中的函数和定义为函数的函数方面遇到了一些问题 (我希望我理解正确)。我做了很多搜索,出现的主要问题是委托和 lambda,但是尝试实现它们对我来说很难做到。看起来安静的几个部分在布局中是相同的,我只发布一个通用的 AS3 代码示例,然后希望可以将任何解决方案应用于其余部分。

这是 AS3 代码:

  static public function makeRadial(seed:int):Function {
    var islandRandom:PM_PRNG = new PM_PRNG();
    islandRandom.seed = seed;
    var bumps:int = islandRandom.nextIntRange(1, 6);
    var startAngle:Number = islandRandom.nextDoubleRange(0, 2*Math.PI);
    var dipAngle:Number = islandRandom.nextDoubleRange(0, 2*Math.PI);
    var dipWidth:Number = islandRandom.nextDoubleRange(0.2, 0.7);

    function inside(q:Point):Boolean {
      var angle:Number = Math.atan2(q.y, q.x);
      var length:Number = 0.5 * (Math.max(Math.abs(q.x), Math.abs(q.y)) + q.length);

      var r1:Number = 0.5 + 0.40*Math.sin(startAngle + bumps*angle + Math.cos((bumps+3)*angle));
      var r2:Number = 0.7 - 0.20*Math.sin(startAngle + bumps*angle - Math.sin((bumps+2)*angle));
      if (Math.abs(angle - dipAngle) < dipWidth
          || Math.abs(angle - dipAngle + 2*Math.PI) < dipWidth
          || Math.abs(angle - dipAngle - 2*Math.PI) < dipWidth) {
        r1 = r2 = 0.2;
      }
      return  (length < r1 || (length > r1*ISLAND_FACTOR && length < r2));
    }

    return inside;
  }

在 AS3 代码中,我不明白主函数“static public function makeShape(seed:int):Function”中“:Function”背后的原因。我确实搜索过它,但找不到示例或解释,也许我没有输入正确的含义。

如果有人可以通过举个例子或让我更接近我需要去的方向来帮助我解决这个问题,我将非常感激。

感谢您的宝贵时间。

【问题讨论】:

  • 您的 AS3 函数无效 - 缺少 {(或额外的 })。
  • 对不起,你们都说对了,我刚刚意识到我复制了错误的代码,我只是用正确的代码替换了它并删除了 c# 示例。
  • 我确实看到了这个问题并尝试使用它,但无法完全理解它适用于我的问题,谢谢。

标签: c# actionscript-3 function methods porting


【解决方案1】:

最直接的翻译是返回delegate。在这种情况下,通用的 Func&lt;Point, bool&gt; 委托就足够了。使用 lambda expressions 在 C# 中创建这些非常容易:

static public Func<Point, bool> makeShape(int seed) {
    // initialization here

    Func<Point, bool> inside = (Point q) => {
        // some math here
        return (myCondition);
    }
    return inside;
}

虽然您可以根据需要定义自己的委托类型:

public delegate bool ShapeTester(Point point);

static public ShapeTester makeShape(int seed) {
    // initialization here

    ShapeTester inside = (Point q) => {
        // some math here
        return (myCondition);
    }
    return inside;
}

另一种方法,但在重构中需要更多努力,是将构成“形状”的所有逻辑封装到一个不同的类型中,例如:

public class Shape
{
    public Shape(int seed) 
    {
        // initialization here
    }

    public bool Test(Point q)
    {
        // some math here
        return (myCondition);
    }
}

然后从您的makeShape 方法返回此类型的实例:

static public Shape makeShape(int seed) {
    return new Shape(seed);
}

在其他地方,您需要在结果对象上调用测试方法。根据您正在开发的具体情况,您可能会做得更多,因为如果Shape 实际上是一个接口(@98​​7654332@)或一个结构。但无论如何,使用这种方法,应该遵循传统的OOP design 原则(继承、多态等)。

【讨论】:

  • 非常感谢,我尝试使用委托,但未能以正确的方式完成任务。感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2019-03-14
相关资源
最近更新 更多