我试图利用C#中的迭代器来清理我在制作的游戏中的对象上的一些空间查询。使用yield和foreach在无拳击/拆箱的情况下迭代对象的自定义集合
下面是我在做什么目前:
public struct ObjectInfo
{
public int x, y;
public int Type;
public int hp;
}
public static IEnumerable<ObjectInfo> NearbyObjects(int x, int y, int distance)
{
// Not actually what I'm doing, but for simplicity...
for (int i = 0; i < 10; ++ i)
{
yield return new ObjectInfo();
}
}
public static void Explode()
{
foreach (ObjectInfo o in NearbyObjects(0, 0, 1))
{
o.hp = 0;
}
}
除了我认为有一些装箱/拆箱回事这个伟大的工程。 CLRProfiler似乎验证了这一点,因为我看到分配发生在我的Explode方法中。我非常想在启动后避免任何分配,所以我没有在关卡或其他东西中触发垃圾回收器。有什么方法可以保持这种语法,同时避免任何分配?也许通过实现我自己的迭代器或什么?
我明白了。我想也许我的ObjectInfo被迭代器以某种方式塞入到一个对象中。我可以让我自己的迭代器也是一个结构吗?我会查看你提供的链接,看看我能否从中找到答案。 – hahanoob 2011-05-17 01:53:18
看来不可能在没有在幕后分配类对象的情况下使用yield return。那真不幸。 – hahanoob 2011-05-17 02:20:07
@haha:如何在不创建对象的情况下返回'IEnumerable'? –
SLaks
2011-05-17 02:38:17