Гетери и сетери

Методе get и set у програмском језику C# углавном се користе за приступ и измену приватних или заштићених поља у класи. Ове методе омогућавају контролисано читање и писање вредности, што помаже у имплементацији принципа енкапсулације. Дефинисана метода get популарно се назива „гетер”, док се дефинисана метода set популарно назива „сетер”.

На почетку овог поглавља научио си да су својства класе заправо методе којима се приступа као да су поља класе. Унутар својстава обично се дефинишу get и/или set методе. Значи, својство је члан класе који може имати get и/или set методе.

Једноставан пример употребе метода get и set унутар једног својства може да буде:

public class NekaKlasa
{
    private int vrednost;          // Приватно поље

    public int Vrednost            // Својство
    {
        get { return vrednost; }   // Метода за добијање вредности
        set { vrednost = value; }  // Метода за постављање вредности
    }
}

Метода get дефинише како се вредност поља чита. Када се позове својство, извршава се get метода. Метода set дефинише како се вредност поља поставља. Приликом постављања нове вредности својству, извршава се set метода. Значи, ове методе се не позивају експлицитно, већ имплицитно приликом приступања својству.

Можеш користити само методу get ако желиш само читање (без измене), односно, можеш користити само методу set својства, ако желиш само записивање (без читања). Унутар get и set метода можеш користити модификаторе приступа private или protected. Када користиш private унутар методе set, дозвољаваш да се вредност својства може изменити само унутар саме класе, али не и ван ње. Ово је корисно ако желиш да контролишеш како и када се вредност својства мења. Ако користиш private у get методу, вредност својства ће бити доступна само унутар класе, чиме се спречава спољни код да прочита ту вредност. Када користиш protected унутар get или set метода, омогућаваш да својство буде доступно у класи у којој је дефинисано и у свим класама које наслеђују ту класу. Ако користиш private унутар методе set, али оставиш get метод као public, својство ће бити само за читање ван класе, али може бити „подешено” унутар класе.

Нека је задатак да се у класи Ucenik у пољу godine постави број година ученика средње школе, који може бити у опсегу од 14 до 19 година. Сваки број мањи од 14 или већи од 19 није прихватљив.

using System;

class Ucenik
{
    private int godine;

    public int Godine
    {
        get { return godine; }
        set
        {
            if (value > 13 && value < 20)
            {
                godine = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Недозвољени број година.");
            }
        }
    }
}

class Program
{
    static void Main()
    {
        Ucenik u1 = new Ucenik();
        u1.Godine = 17;                // Позива се set метод
        Console.WriteLine(u1.Godine);  // Позива се get метод
    }
}

У овом примеру демонстриран је пример добре праксе енкапсулације и валидације унетог податка.