Sumez wrote:AFAIK the GC in .NET runs on a different thread than your main program, keeping it from interfering with the program and cause frame drops.
This is somewhat accurate, but not quite the whole story, and it depends on the platform.
On Windows, the GC is generational - that is, certain types of objects can be collected very efficiently, and you frequently won't see any framerate drop from then. However, if you ever need to do a Generation 2 collection (and, sorry, I cannot remember the exact triggers), it will be a bit more spendy and use a bit more resources. However, overall, on Windows it's not such a big deal.
On the Xbox (via XNA), however, it's a different story - the GC is just a mark and sweep collector. Basically, it has to halt all threads, do a quick mark of all of the objects that are currently in use, then sweep through all objects to clear the ones that aren't in use. Then it will, generally, compact the heap to make it more contiguous in memory. For reasons that you can probably figure out, this type of operation can't be done while objects are changing, hence the need to freeze everything.
In any case, the GC is generally only triggered when new memory is allocated - that is, if you don't allocate things on the fly, you won't get garbage collection on the fly, either.
The funny thing about the focus on the GC causing performance issues in C#, to me, is that in C++, you also generally avoid allocating memory on the fly - instead relying on pre-allocated memory pools that you manage to avoid the expensive cost of malloc or new. This is the exact same technique that you can use in C# to totally avoid the GC hurting your framerate - simply allocate what you're going to need up-front and don't allocate anything during critical points of game runtime.
This is something that you should probably be doing regardless of the language you're working in