as3到c#移植函数内的函数?

时间:2015-01-13 01:37:51

标签: c# actionscript-3 function methods porting

我试图将一些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代码中,我不理解&#34;:功能&#34;背后的原因。在main函数&#34;静态公共函数makeShape(seed:int):Function&#34;。我确实搜索了它,但无法找到一个例子或解释,也许我没有为它输入正确的含义。

如果有人可以通过举例或指点我朝着我需要去的方向帮助我解决这个问题,我将非常感激。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

最直接的翻译是返回delegate。在这种情况下,通用Func<Point, bool>委托就足够了。使用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实际上是一个接口(IShape)或结构,您可以做更多。但无论如何,使用这种方法,应遵循传统的OOP design原则(继承,多态等)。