Λοιπόν, τα πράγματα δεν δουλεύουν ακριβώς έτσι... Το Dispose δεν ελευθερώνει μνήμη. Είναι απλά μία - κατά σύμβαση - μέθοδος στην οποία ο developer της κλάσης τοποθετεί cleanup κώδικα. Η "απελευθέρωση" της μνήμης θα γίνει μόνο όταν θα τρέξει ο Garbage Collector και πέραν από το να κάνεις GC.Collect (και κατόπιν να καείς στο πυρ το εξώτερον που λέει και ο Παναγιώτης) δεν υπάρχει άλλος τρόπος να ανακτήσεις την μνήμη που καταλαμβάνουν τα άχρηστα managed objects.
Για την ακρίβεια, όσο και να καλείς την dispose του Dataset, δεν γίνεται τίποτα! Δοκίμασε να φτιάξεις ένα dataset, να καλέσεις την dispose και κατόπιν να κάνεις bind πάνω σε αυτό το Dataset ένα grid.
O λόγος που υπάρχει η Dispose στο Dataset είναι ότι αυτή η κλάση κληρονομεί την System.ComponentModel.MarshalByValueComponent προκειμένου να υφίσταται και ως component που μπορεί να τοποθετηθεί πάνω στις φόρμες μας, δηλαδή σε κάποιον container. Ένας container, για κάθε component που τοποθετούμε πάνω του, φτιάχνει ένα site. H Dispose του Dataset δεν κάνει override την Dispose του MarshalByValueCompenent , όπερ σημαίνει ότι καλούμε τελικά αυτήν η οποία απλά ασχολείται με διαδικασίες τακτοποίησης και cleanup (ελέγχει ποιά sites είναι valid ή όχι και κάνει remove το instance του component από αυτά) του component κατά το design time.
Vir prudens non contra ventum mingit