C# 中有类似'out of scope'的东西吗?还有一些相关问题

  • 本文关键字:问题 out of scope c#
  • 更新时间 :
  • 英文 :


我是C#-Newbie。

我的函数应该从列表中返回所有值,该函数具有匹配的时间戳记:

static public PointCloud getPointsByTime (float time)
{
    PointCloud returnList = new List<PointData> ();
    for (int i = 0; i < _pointCloud.Count; i++) {
        if (_pointCloud [i].time == time) {
            returnList.Add (_pointCloud [i]);
        }
    }
    return returnList;
}

其中

public class PointData
{
    public float time;
    // and some other members
}

// let's call a list of PointData-objects a PointCloud
using PointCloud = System.Collections.Generic.List<PointData>;

我的功能会做我想做的事吗?还是我必须创建一个新的PointData -Object?我可以使用我返回的PointCloud还是不超出范围并删除?

这可能不是解释的最好例子,因此可以随意将我链接到更好的东西。我认为您得到了我的基本拼接。

@patrick建议继承列表似乎更合理,但是我会走得更远,我只会使用列表,这样您就不会创建不必要的类,如果它不添加列表任何额外的东西。

也建议您查看Linq,这使代码更可读,并且是您希望尽快掌握的非常强大的功能。:)

您的方法可以看起来像这样:

_pointCloud.Where(p => p.time == time).ToList();

也尝试熟悉属性:

public class PointData
{
      public float Time { get; set; }
}

您可能需要遵循更标准的C#编码样式(尽管这是完全个人的),将Pascalcase用于公共成员而不是骆驼。

您的代码正确。您可以这样使用您的功能:

var someTime = 0.0f;
var pointsAtTime = getPointsByTime(someTime);
DoSomethingWith(pointsAtTime);

如果将其分配给某些局部变量(例如,在此处使用pointsAtTime),则函数的返回值保留在范围中。

编辑:正如彼得·施耐德(Peter Schneider)在注释中正确指出的那样,您需要意识到此功能在匹配点上创建了一个带有 References 的新列表,并且不会创建新的点。这可能是您想要的也可能不是您想要的。


但是,如果您是C#的新手,那么您可能想记住以下一些事情:

  1. C#中的方法通常在Titlecase中命名,例如GetPointsByTime,而不是getPointsByTime
  2. 将名称分配给诸如using PointCloud = List<PointData>之类的通用类型,虽然在技术上允许,但并不是很惯用,可能会使您的代码中的其他读者感到困惑。如果您认为PointData的列表足够特殊,可以拥有自己的类型,请为其创建一种类型(通过从List<PointData>继承,或者最好使用IList<PointData>作为新PointCloud类中的成员)。或者只使用using System.Collections.Generic并在整个代码中使用List<PointData>,这是大多数人会做的。
  3. 比较平等的浮点数有时会灰心,因为在某些情况下,由于表示错误,这可能会失败;如果时间确实是一个连续的价值,则可能需要在特定时间段内查找点(例如,在您所需的时间围绕某个范围内的点)。但是,您现在不必担心这一点。

相关内容

最新更新