Kai nenorime apibrėžti sudėtingų klasių, tokių kaip sudėtingi metodai, įvykiai ir konstruktoriai, galime dinamiškai generuoti pasirinktinį duomenų tipą -> anoniminį tipą.
1. Apibrėžkite anonimiškumo tipą
Apibrėždami anoniminį tipą, turite naudoti raktinį žodį var ir objekto inicijavimo sintaksę.
var: kompiliatorius automatiškai sugeneruoja naują klasės apibrėžimą kompiliavimo metu (C# kode nematome klasės pavadinimo).
Inicijavimas: Jis nurodys kompiliatoriui sukurti privačius fono laukus ir (tik skaityti) ypatybes naujai sukurtam tipui.
Sukurkite anoniminį tipą perduodami parametrus ir atspausdinkite atitinkamą informaciją
Skambinti: Anoniminiai tipai taip pat gali būti kuriami naudojant kietąjį kodą
2. Vidinis anoniminių tipų atstovavimas
Visi anoniminiai tipai automatiškai paveldimi iš objekto, todėl automobilio objekte galime naudoti ToString, GetHashCode, Equals, pabandykime tai pavadinti:
Kvietimai teikti paraiškas ir rezultatai:
Automobilio objekto tipas yra: <>f__AnonymousType03 (jūsų gali skirtis), anoniminį tipo pavadinimą jaučia kompiliatorius, mes negalime įsikišti, CIL kodas.
3. Metodų ToString() ir GetHashCode() įgyvendinimas.
1.ToString()
2.GetHashCode()
Jis naudoja kiekvieno anoniminio tipo kintamąjį, kad apskaičiuotų maišos reikšmę kaip System.Collections.Generic.EqualityCompare tipo įvestį, ir <T>sukuria tą pačią maišos reikšmę tik tuo atveju, jei du anoniminiai tipai turi tas pačias savybes ir jiems suteikiama ta pati reikšmė.
4. Vienoda anoniminių tipų semantika
Lygu()
Išanalizuokite rezultatus:
1. Equals(): kompiliatorius perrašo Equals(), kad nustatytų, ar objektai yra lygūs, remdamasis reikšmių semantika (pvz., pažymi kiekvieno dviejų objektų duomenų nario reikšmę)
2. == Operatoriai: Kadangi anoniminiai tipai neperkrauna lygiaverčių operatorių (== , !=), == lygina nuorodas, o ne turinį.
3. GetType(): Nes jei tame pačiame rinkinyje paskelbsime du identiškus (su tais pačiais atributais) anoniminius tipus, kompiliatorius sugeneruos tik vieno anoniminio tipo apibrėžimą.
5. Anoniminiai tipai, kuriuose yra anoniminių tipų
Suvestinė:
Tiesą sakant, turėtume būti atsargūs naudodami anoniminius tipus, ypač kai naudojame LINQ, ir niekada neatsisakyti naudoti stipriai įvestas klases ar struktūras dėl anoniminių tipų atsiradimo.
Tiesą sakant, pats anoniminis tipas turi daug apribojimų:
- Jūs nekontroliuojate anoniminio tipo pavadinimo
- Anoniminiai tipai paveldi System.Object
- Anoniminiai laukų ir atributų tipai visada yra tik skaitomi
- Anoniminiai tipai nepalaiko įvykių, pasirinktinių metodų, pasirinktinių operatorių ir pasirinktinių perrašymų
- Anoniminiai tipai yra numanomi užantspauduoti
- Kuriant anoniminius tipus naudojamas tik numatytasis konstruktorius
Jei mums reikia greitai apibrėžti objekto formą, neapibrėžiant jo funkcijos, galime naudoti anoniminį tipą. |