Object initializers, Type Inference & Anonymous Types


Ένα χαρακτηριστικό της VB 9 είναι ο νέος τρόπος που μπορεί κανείς να κάνει initialize objects. Παλιότερα, για να φτιάξουμε ένα object θα έπρεπε να πούμε κάτι σαν το παρακάτω:

Dim emp As New Employee()
With emp
    .Name = "John Smith"
    .DepartmentID = 123
    .Salary = 1500
End With

Τώρα πλέον μπορούμε (απλούστερα) να πούμε:

Dim emp2 As Employee = New Employee With {.Name = "Ann", .DepartmentID = 123, .Salary = 1500} 

Σε περίπτωση που δεν συμπεριλάβουμε όλα τα properties στα οποία θέλουμε να δώσουμε τιμές, τότε όσα παραλείψουμε θα αποκτήσουν τη default τιμή. Μπορούμε ακόμα να πούμε και:

Dim emp2 As Employee = New Employee With {} 

Για να μπορούμε να χρησιμοποιήσουμε το παραπάνω συντακτικό, θα πρέπει η κλάση να έχει default constructor. Μάλιστα, πάντοτε χρησιμοποιείται αυτός, ακόμα κι αν υπάρχει parameterized constructor που «ταιριάζει» περισσότερο με τον object initializer που χρησιμοποιούμε.

Πακέτο με τον νέο initalizer πηγαίνει κι άλλο ένα χαρακτηριστικό που ονομάζεται Type Inference. Μπορούμε να παραλείψουμε το As clause και ο compiler θα καταλάβει τον τύπο της μεταβλητής βάσει του ορίσματος.

Dim intSomething = 1
Dim strSomething = "John Smith" 

Τα παραπάνω μπορεί να φέρνουν στο νου άσχημες αναμνήσεις από VB 6 και late binding ωστόσο τώρα έχουμε strong types και όχι generic objects. Αυτό θα το διαπιστώσετε καθώς για το intSomething και strSomething θα έχετε κανονικό IntelliSense! Παράλληλα, το Option Infer Off μπορεί να χρησιμοποιηθεί για να ακυρώσουμε αυτήν την συμπεριφορά.

Έτσι, το προηγούμενο παράδειγμα μπορεί να ξαναγραφτεί ως εξής:

Dim emp3 = New Employee With {.Name = "Ann", .DepartmentID = 123, .Salary = 1500} 

Ενώ μπορούμε να φτιάξουμε εύκολα ένα array:

Dim emps() = { _
          New Employee With {.Name = "Ann", .DepartmentID = 123, .Salary = 1500}, _ 
          New Employee With {.Name = "John", .DepartmentID = 125, .Salary = 1300}, _
          New Employee With {.Name = "Paul", .DepartmentID = 128, .Salary = 1600}}

Τέλος, υπάρχουν και τα anonymous types:

Dim emp4 = New With {.Name = "Rick", .DepartmentID = 130, .Salary = 1280} 

Όταν ο compiler συναντήσει κάτι τέτοιο, τότε δημιουργεί ένα νέο object με τύπο που καθορίζεται on the fly και έχει ως properties αυτά που έχουμε καθορίσει στον initializer, δεν χρειάζεται δηλαδή να καθορίσουμε class definition.

Δοκιμάστε το παρακάτω πείραμα:

        Dim emp1 = New With {.Name = "Ann", .DepartmentID = 123, .Salary = 1500}
        Dim emp2 = New With {.Name = "John", .DepartmentID = 125, .Salary = 1300}
        Dim emp3 = New With {.Name = "Paul", .DepartmentID = 128, .Salary = 1600, .HireDate = #1/1/2001#}
        Dim emp4 = New With {.Name = "Paul", .DepartmentID = 128,  .HireDate = #1/1/2001#, .Salary = 1600}
        Console.WriteLine(emp1.GetType)
        Console.WriteLine(emp2.GetType)
        Console.WriteLine(emp3.GetType)
        Console.WriteLine(emp4.Equals(emp3))

Tα Anonymous Types χρησιμοποιούται περισσότερο ως temporary objects. Δεν έχουν methods και δεν μπορεί να χρησιμοποιηθεί το type definion που έχουν σε delegates κλπ.


		
Advertisements


Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s