我在联合中制作了一个NPC路径工具,我从另一个堆栈溢出帖子(如何使bezier连续或非连续的单个锚点)中借用了一些功能。
我没有复制或重新使用任何我自己无法做到的东西,唯一的例外是这一行(在文章的底部),不幸的是,整个程序都依赖于这一行。
我知道这是某种内联函数声明/定义,但我不明白它是如何工作的。我认为最终的结果是生成了一个ControlPoint列表,但我不完全确定。
我不会为此烦恼,但我总是从另一个类的循环中得到一个超出界限的错误,并且错误代码指向这一行。我相信,如果我能理解这条线并解构它,我就能解决它。我怀疑它是某种特定于C#的三元操作符,但我以前从未见过它,尽管我尝试过,但我不知道该搜索什么,也不知道在哪里找到合适的文档来解释它。
所以,本质上,我要求解释这个人所使用的特定代码行上的语法糖,这样我就能够解构这一行代码,并在我的程序中解决这个问题。
任何帮助都是感激的,干杯!
(原始代码样本):
public ControlPoint this[int i] { get { return points[(loop && i == points.Count) ? 0 : i]; } }(ControlPoint是一个独立的类,用于定义锚点和切点在贝塞尔曲线上的属性和方法)
(点数是ControlPoints的列表)
(循环是一个布尔变量,它定义路径是否已关闭)
编辑:看起来我不明白的原因不仅仅是因为我不太熟悉三元操作符,而是因为这个人使用了索引器/智能数组,这是我以前从未见过的。我将删除它,因为我个人认为它过于复杂,但是这里是完全解构的索引器(没有任何三元操作符):
public ControlPoint this[int i]
{
get
{
if (loop && i == points.Count)
{
return points[0];
}
else
{
return points[i];
}
}
}谢谢大家的帮助!
发布于 2022-03-28 19:12:31
下面是详细的版本:
if ((loop) && (i == points.Count))
{
return points[0];
}
else
{
return points[i];
}如果在最后一个元素之后请求第一个元素,则返回第一个元素似乎是在“循环”数组。这意味着如果数组有10个元素(从0到9),并且请求元素10,它将“循环”并返回第一个元素。
一个“更安全”的选择(与您的问题正交)是使用模块化(%)操作符来启用“循环”(更常见的称为循环缓冲器 ):
if (loop))
{
return points[i % points.Count];
}
else
{
return points[i];
}或者只是
return points[loop ? (i % points.Count) : i];https://stackoverflow.com/questions/71652410
复制相似问题