Well, there are 2 reasons for this code and before I tell you why I did it, keep the following rule in mind: Never dispose anything unless you really have to. For example it is a good idea to dispose FileStreams to close files, but for textures or your own game classes, disposing is usually not required!
The Racing Game is a really complex game for the compact framework and I guess the XNA team did not really expect someone to be that crazy and build a racing game in a few weeks with the early beta code ^^ There were many issues with the beta 1 and disposing hat a lot of issues, which were mostly fixed later. But I let the Dispose code stay in the Racing Game (I removed it from all other games as far as I can remember) because it still made sense to clear everything up after a game and prepare for a new level. Else the memory consumption would go as high as having all the data that is ever loaded in the game (all levels, all cars, all 3d models, etc.) all loaded up in memory at the same time. On the PC this is not really an issue because there are just 3 levels, but if you imagine a bigger game with more maps you probably want to make sure that you get rid of stuff you won't need anymore after completing a mission.
On the compact framework it was a very bad performance hit to have the Garbage Collector kick in from time to time. This was not just the textures and level data at the end of a mission, but all the foreach loops also created IEnumerator objects, which were disposed a few seconds later and made the game very jerky. I did not find out about this until later after I already added all the dispose code, but after removing all foreach loops and after making sure no objects are created in a frame, the game performance went up to a couple of hundred frames with all game logic on (with got less by adding more objects, more shaders and increasing to HDTV resolutions).
Anyway, the first line in the Dispose method makes sure everything is disposed that was created in this class and the second line (SuppressFinalize) just makes sure this Dispose method is not called again and the finalizer does not need to be executed, which also is good for the performance of the Garbage Collector because I usually Dispose stuff at the end of the mission or a game screen anyway.
Hope this makes sense ..
http://abi.exdream.com