Ο κύριος λόγος για να χρησιμοποιήσεις Typed Datasets είναι ακριβώς το type safety. Είναι άλλο πράγμα να λες
NorthwindDataSet.Tables("Categories")
και άλλο πράγμα
NorthwindDataSet.Categories
Στην πρώτη περίπτωση, πέρα του ότι πληκτρολογείς περισσότερα, αν κάνεις λάθος μέσα στα quotes, θα το ανακαλύψεις με runtime exception. Παρομοίως, είναι άλλο πράγμα να γράφεις
NorthwindDataSet.Tables("Categories").Rows.Find("CategoryID=" & CategoryIdTextBox.Text)
και άλλο
NorthwindDataSet.Categories.FindByCategoryID(Int.Parse(CategoryIdTextBox.Text))
Επίσης, και τα DataRows είναι typed οπότε όταν παίζεις πάνω σε κάποιο row, σε untyped dataset θα πρέπει να γράφεις κάτι σαν
rowCategory.Item("CategoryName") = "Test"
ενώ σε typed
rowCategory.CategoryName = "Test"
Νομίζω είναι προφανή τα πλεονεκτήματα. Επιπρόσθετα ένα benefit που δεν φαίνεται εξ αρχής είναι το εξής: Αν γίνουν αλλαγές στο schema της βάσης, θα πρέπει να ενημερώσεις το typed dataset χρησιμοποιώντας τον designer πράγμα που σημαίνει ότι θα έχεις compile-time errors για τα πεδία, τα constraints, κλπ που πλέον έχουν αλλάξει. Στην περίπτωση όμως που χρησιμοπιούσες untyped dataset, τότε θα έπρεπε να βρεις χειροκίνητα και να αλλάξεις όλα αυτά τα σημεία (χμμμ... και αν ξεφύγει κανένα; Ε, θα το βρεις στο runtime).
Τώρα, ως προς τη διαφορά στο performance, δεν ξέρω που εντοπίζεται στο link που βρήκες. Ενδεχομένως να αναφέρεται στη δημιουργία του object αφού όντας πιο πλούσιο σε functionality, μάλλον θα χρειάζεται λίγο παραπάνω χρόνο για να φτιαχτεί το instance. Πέρα από αυτό, δεν γνωρίζω να υπάρχει άλλη διαφορά. Ίσως να χρειάζεται λίγο benchmarking. Εδώ πάντως δείχνει ότι υπερέχουν.
Vir prudens non contra ventum mingit