【问题标题】:Unfamiliar and strange syntax regarding => in C#关于 C# 中 => 的不熟悉和奇怪的语法
【发布时间】:2016-02-11 22:08:54
【问题描述】:

我正在尝试将开源 C# 程序的一部分移植到 java 中,并且遇到了一段完全没有意义的代码,我无法在线找到任何语法解释,并且没有工具提示或甚至是 MCVS 中给出的运算符的名称,以便进行更具体的搜索。

branch 是一种“Particle3D”类型,表示 3d 位置和旋转。 行为是 void 函数(Particle3D)的委托(我已将其替换为 java 中的简单抽象类)。

根据视觉工作室的说法,b 是一个临时的 Particle3D。

这里到底发生了什么?看起来这是将一个particle3D分配给代表一个将Particle3D作为参数的函数的委托,过去我不知道=>运算符或以下代码块的含义,我假设它以某种方式重载(这是为branch.Behavior分配一个未命名的函数吗?)

branch.Behaviour = b =>
{
    LeavesBehaviour(b);
    BranchingBehaviour(branchingPercent, b, depth + 1);

    // weight behaviour
    if (applyWeightOnBranches)
        b.Direction = new Vector3D(initialDirection.X, initialDirection.Y * LineairScaleTo((double)b.Life / (double)branch.MaxLife, -1f, 1f), initialDirection.Z);// +(2 * (((double)b.Life / (double)maxLife)) - 1);
};

我的最终目标是让它在 java 中正常工作,其余代码全部移植而没有任何实际问题。

【问题讨论】:

  • 检查 'lambda' 不,它是 => 不是 >= !
  • b => {} 是一个匿名函数。相当于方法签名void anonymousMethod(Particle3D b) { [...] }
  • 在 Java 中你可能会写类似brach.behaviour = b -> { ... } 的东西。
  • 这只是在 Java 8 中引入

标签: java c# syntax


【解决方案1】:

代码可以改写如下:

void MyMethod(Particle3D b)
{
    LeavesBehaviour(b);
    BranchingBehaviour(branchingPercent, b, depth + 1);

    // weight behaviour
    if (applyWeightOnBranches)
        b.Direction = new Vector3D(initialDirection.X, initialDirection.Y * LineairScaleTo((double)b.Life / (double)branch.MaxLife, -1f, 1f), initialDirection.Z);// +(2 * (((double)b.Life / (double)maxLife)) - 1);
};

然后..

branch.Behaviour = MyMethod;

请注意,您的 当前 代码定义了一个匿名方法,但是,希望这可以阐明语法所代表的含义

【讨论】:

  • 我认为这不一定是真的,因为 Method 实现不会考虑对 lambda 有效的任何闭包。例如,每次定义 branch.Behavior 时,'depth' 变量看起来都可能不同。 OP 需要了解这种细微差别,否则会庆幸没有关闭活动(我承认这是可能的情况。)
  • 为什么不使用 Java lambda 作为 C# lambda 的等价物? Java 8 已经发布了一段时间...
  • @DaveDoknjas 因为我好多年没用过Java了,不知道语法是什么样子的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多