1. Mis on üldine?
Generikad on uued süntaksid, mis tutvustati C# 2.0-s, mitte süntaksi sugar, vaid funktsioonid, mida pakuvad raamistiku uuendused 2.0-s.
Kui me programmeerime programme, kohtame sageli mooduleid, millel on väga sarnased funktsioonid, kuid need töötlevad erinevaid andmeid. Kuid meil pole muud valikut kui kirjutada mitu meetodit eraldi, et hallata erinevaid andmetüüpe. Praegu on küsimus, kas on võimalik kasutada sama meetodit erinevate parameetrite puhul? Generikumide tekkimine on spetsiaalselt loodud selle probleemi lahendamiseks.
2. Miks kasutada geneerikuid
Vaatame järgmist näidet:
Tulemus:
Ülaltoodud tulemustest näeme, et neil kolmel meetodil on samad funktsioonid, välja arvatud erinevad parameetrid, mida nad läbivad. Versiooni 1.0 ajal polnud generikute mõistet, nii et mida teha. Usun, et paljud inimesed mõtlevad ühe OOP kolmest peamisest omadusest pärimisele, me teame, et C#-s on objekt kõigi tüüpide baasklass ja ülaltoodud kood on optimeeritud järgmiselt:
Tulemus:
Ülaltoodud tulemustest näeme, et objektitüübi kasutamine vastab meie nõuetele ja lahendab koodi korduvkasutuse. Mõned inimesed võivad küsida, miks on võimalik sisestada int, string jne, kui see on määratletud objektitüübina? Põhjuseid on kaks:
1. Objektitüüp on kõigi tüüpide vanemklass.
2. Pärilikkuse kaudu on alamklassidel kõik vanemklassi atribuudid ja käitumised ning kus iganes vanemklass esineb, saab selle asendada alamklassidega.
Kuid ülaltoodud objektitüübi meetod toob kaasa veel ühe probleemi: pakkimine ja lahtipakkimine võivad programmi jõudlust vähendada.
Microsoft tutvustas C# 2.0 versioonis generikume, mis suudab ülaltoodud probleemid väga hästi lahendada.
3. Üldised tüübiparameetrid
Üldises tüübis või meetodi definitsioonis on tüübiparameeter kliendi poolt määratud kohatäitja, kui ta instantsiseerib selle tüübi muutuja. Üldist klassi (GenericList<T>) ei saa kasutada sellisena, kuna see ei ole tõeline tüüp; See on pigem tüüpide plaan. GenericListi kasutamiseks <T>peab kliendikood deklareerima ja instantsima konstruktsioonitüübi, määrates tüübiparameetri nurksulgudes. Selle konkreetse klassi tüübiargument võib olla ükskõik milline tüüp, mida kompilaator tunneb. Saad luua suvalise arvu konstruktsioonitüübi instantse, igaühel erinev tüübiparameeter.
Ülaltoodud näite koodi saab muuta järgmiselt:
Helista:
Näita tulemusi:
|