J'essaie de tirer parti des itérateurs en C# pour nettoyer certaines requêtes spatiales sur les objets dans un jeu que je fais.itération sur une collection personnalisée d'objets avec rendement et foreach sans boxe/unboxing
Voici ce que je fais actuellement:
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;
}
}
Cela fonctionne très bien, sauf que je pense qu'il ya de la boxe/unboxing passe. Le CLRProfiler semble vérifier cela car je vois des allocations se produire dans ma méthode Explode. J'aimerais beaucoup éviter les allocations après le démarrage, donc je ne déclenche pas le garbage collector au milieu d'un niveau ou quelque chose. Est-il possible de garder cette syntaxe en évitant toute allocation? Peut-être en mettant en œuvre mes propres itérateurs ou quelque chose?
Je vois. Je pensais que mon ObjectInfo était peut-être bourré dans un objet par l'itérateur. Est-ce que je peux faire mon propre itérateur qui est aussi un struct? Je vais regarder par-dessus le lien que vous avez fourni et voir si je peux le comprendre. – hahanoob
Il semble qu'il ne soit pas possible d'utiliser le rendement de rendement sans affecter un objet de classe dans les coulisses. C'est malheureux. – hahanoob
@haha: Comment pouvez-vous retourner un 'IEnumerable' sans créer d'objet? –
SLaks