CS-opas:Ominaisuus
Mureakuha
- Teknisistä rajoituksista johtuen artikkelin yllä näkyvä otsikko on virheellinen. Oikea otsikko on C#-opas: Ominaisuus.
Property
Aikaisemmissa luvuissa mainitsi näppärästä ominaisuudesta, jolla tympeät get ja set metodit voi unohtaa ja käyttää muuttujia samannäköisesti, kuin public muuttujia, vaikka ovatkin suojassa private tai protected näkyvyydellä. Property mahdollistaa vielä helpon tavan tehdä tarkistustoimenpiteitä, ennen arvon asentamista. Esimerkissä on tehty tarkistus: jos arvo on yli 200 asetetaan muistiin kuitenkin vain se 200, ja jos arvo on pienenpi asetetaan se muistiin.
Esimerkki 1
using System; public class PropertyClass { private int privaattiArvo; PropertyClass() { this.privaattiArvo = 0; } public int Arvo { get { return this.privaattiArvo; } set { if(value<200) { this.privaattiArvo = value; } else { this.privaattiArvo = 200; } } } public static void Main() { PropertyClass testi = new PropertyClass(); testi.Arvo = 370; Console.WriteLine("Arvo on {0}",testi.Arvo); } }
Esimerkissä on sekä get, että set, mutta halutessaan toisen voisi jättää pois, jolloin sitä ei sitten ole käytettävissä.
Huomaa, että C# 1.0 versioissa get ja set accessorit saavat saman näkyvyyssäännön, mikä propertylle on määrätty. Eli siis ylläolevassa tapauksessa Arvo-propertyn molemmat accessorit ovat julkisia. 2.0 versiossa on mahdollista eritellä accessorit niin, että niillä on eri näkyvyyssäännöt. Huomionarvoista on myös se, että jotkin komponentit kuten PropertyGrid etsivät objekteista nimenomaan niiden propertyja, jolloinka joskus on kätevä luoda läpinäkyviä propertyja, joiden ainut tehtävä on muuttaa jonkin private-kentän tietoja.
Indexers
Propertilla voitiin muuttaa metodi näyttämään muuttujalta. Indexerillä voidaan muuttaa olio näyttämään taulukolta. Esimerkki ei ole erityisen näppärä, mutta käsitteen miten tuo kirjoitetaan siitä pitäisi saada. Parempi esimerkki olisi hyväksi.
using System; public class PropertyClass { private int privaattiArvo; PropertyClass() { this.privaattiArvo = 0; } public int this[int sarake] { get { Console.WriteLine("{0}",sarake); return this.privaattiArvo; } set { Console.WriteLine("{0}",sarake); if(value<200) { this.privaattiArvo = value; } else { this.privaattiArvo = 200; } } } public static void Main() { PropertyClass testi = new PropertyClass(); testi[90] = 370; Console.WriteLine("Arvo on {0}",testi[88]); } }
