Properties
Børre Stenseth
C#>Properties

Properties

Hva
Properties

La oss først se litt på hvordan vi kan kontrollere tilgang til lokale felter i en klasse med de språkverktøyene vi er vant til fra Java og C++. Deretter ser vi på hva som er spesielt med C# begrepet property.

Det er en god vane å deklarere felt i en klasse som "private" eller "protected". Dvs si at de ikke kan leses eller endres utenfra klassen selv (private) eller utenfra klassen eller subklasser( protected). I et av de tidlige objektorienterte språkene, Smalltalk, var alle felter alltid protected, og altså kun tilgjengelige via metoder.

Vi kan bruke tradisjonelle språkmekanismer og lage noe slikt:

class bil1
{
    protected int regno;
    protected string owner;
    public bil1(int n, string s)
    {
        regno = n;
        owner = s;
    }
    public string getOwner(){return owner;}
    public void setOwner(String s){owner=s;}
    public int getRegNo(){return regno;}
    public void setRegNo(int n){regno=n;}
}

Vi har brukt den formen som anbefales i Java, spesielt er dette, sammen med noen andre spesifikasjoner, et krav/konvensjon når vi definerer Javabeans. Altså at vi lager en getXXX og en setXXX metode for å få tilgang til feltene i klassen. Feltene er protected, mens metodene er public. Bruken blir f.eks. slik:

bil1 minBil = new bil1(123,"min");
Console.WriteLine(minBil.getOwner());

Dersom vi skal formulere oss ved hjelp av properties blir det slik:

class bil2
{
    private int regno;
    private string owner;
    public bil2(int n, string s)
    {
        regno = n;
        owner = s;
    }
    public int RegNo{
        get{return regno;}
        set{regno=value;}
    }
    public string Owner{
        get{return owner;}
        set{owner=value;}
    }
}

Hvert av feltene har sin egen get- og set-metode. Merk spesielt at innparameteren i set-metoden alltid har navnet "value". Vi ser altså at for å få det til må vi deklarere properties public. Når vi bruker en slik klasse kan vi skrive:

bil2 dinBil = new bil2(123,"din");
Console.WriteLine(dinBil.Owner);

Properties kan være statiske og vi kan unnlate å deklarere en av metodene. Dersom vi bare definerer get-metoden har vi en read-only situasjon. Det er vanskelig å se at vi rent programmeringsmessig kan oppnå noe mer med properties enn vi kan få til med tradisjonelle mekanismer.

Merk at vi må ha et annet navn på tilgangsmetoden enn på det feltet vi aksesserer. Metoden heter RegNo, mens feltet heter regno. Hvi vi ikke gjør det slik får vi et rekursivt kall på metoden.

Referanser

Koden er sitert i teksten

Du kan eksperimentere med dette og noen andre temaer i programmet:
https://svn.hiof.no/svn/psource/Csharpspikes/language/summary
Vedlikehold

B.Stenseth, august 2005

(Velkommen) C#>Properties (Structer)