繁体   English   中英

这是什么类型的内联 function,它是如何工作的?

[英]What sort of inline function is this and how does it work?

我正在 Unity 中制作一个 NPC 路径工具,并且我从另一篇关于堆栈溢出的文章中借用了一些功能( 如何使贝塞尔曲线的各个锚点连续或不连续)。

我没有复制或重新利用我自己无法制作的任何东西,唯一的例外是这一行(在帖子的底部),不幸的是整个程序都依赖于它。

我知道这是某种内联 function 声明/定义,但我不明白它是如何工作的。 我认为最终结果是正在生成的 ControlPoint 列表,但我不完全确定。

我不会那么在意,但我经常从另一个 class 的循环中得到索引越界错误,错误代码指向这一行。 如果我能理解这一行并解构它,我相信我能够解决它。 我怀疑它是某种 C# 特定的三元运算符,但我以前从未见过它,尽管我已经尝试过,但我不知道要用谷歌搜索什么或在哪里可以找到适当的文档来解释它。

所以本质上,我要求解释此人使用的这一行特定代码的语法糖,以便我能够解构这行代码并解决我程序中的问题。

感谢任何帮助,干杯!

(原始代码示例):

public ControlPoint this[int i] { get { return points[(loop && i == points.Count) ? 0 : i]; } }

(ControlPoint 是一个单独的 class 用于定义锚点和贝塞尔曲线上的切点的属性和方法)

(点是控制点的列表)

(loop是一个boolean变量,定义路径是否闭合)

编辑:看来我不明白的原因不仅仅是因为我不太熟悉三元运算符,而是因为这个人使用了索引器/智能数组,这是我以前从未遇到过的。 我将删除它,因为我个人认为它使事情过于复杂,但这里是完全解构的索引器(没有任何三元运算符):

public ControlPoint this[int i]
    {
        get
        {
            if (loop && i == points.Count)
            {
                return points[0];
            }
            else
            {
                return points[i];
            }
        }
    }

感谢大家的帮助!

这是详细版本:

if ((loop) && (i == points.Count))
{
    return points[0];
}
else
{
    return points[i];
}

如果您在最后一个元素之后请求元素,它似乎通过返回第一个元素来“循环”数组。 这意味着如果数组有 10 个元素(0 到 9)并且您要求元素 10,它将“循环”并返回第一个元素。

“更安全”的替代方法(与您的问题正交)是使用模( % )运算符来启用“循环”(通常称为Circular Buffer ):

if (loop))
{
    return points[i % points.Count];
}
else
{
    return points[i];
}

要不就

return points[loop ? (i % points.Count) : i];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM