Object initializers, Type Inference & Anonymous Types

Έχουν δημοσιευτεί 11 Απριλίου 07 11:48 πμ | KelMan 

Ένα χαρακτηριστικό της 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 κλπ.


	
	
Δημοσίευση στην κατηγορία:

Σχόλια:

# Manos Kelaiditis' Weblog said on Φεβρουαρίου 19, 2008 1:55 μμ:

Σε παλιότερο post μου, είχα αναφερθεί στα Anonymous Types, τα οποία μαζί με το Type Inference και τους

# Anonymous Types: Προσοχ?? στις διαφορ??ς VB.NET – C# « Manos Kelaiditis' blog v2.0 said on Μαΐου 6, 2011 11:38 μμ:

PingBack από http://mkelaiditis.wordpress.com/2008/02/19/anonymous-types-%ce%ae-%ce%ad-vb-net-c/

Έχει απενεργοποιηθεί η προσθήκη σχολίων από ανώνυμα μέλη

Search

Go

Συνδρομές