Short Tip #02: widoczność Auto-Implemented Properties

Stare chińskie przysłowie mówi, że „Krótki fragment kodu wart jest więcej niż tysiąc słów.” Nie przedłużając więc:

class MyClass
{
    private int _member;
    public int Member
    {
        get { return _member; }
        set { _member = value; }
    }
    public MyClass(int value) { _member = value; }
}

Uściślając: w przykładowej klasie jest prywatna zmienna _member, do której odwołujemy się z zewnątrz przez publiczną właściwość (ang. Property) Member. Mechanika obsługi tej zmiennej przez właściwość nie jest zbyt wyszukana, więc możemy zastąpić ją tzw. Auto-Implemented Property (lub krócej Auto-Property). Poniżej tysiąc słów na ten temat:

class MyClass
{
    public int Member { get; set; }
    public MyClass(int value) { Member = value; }
}

Z poziomu kodu używającego klasy MyClass nic się nie zmieniło (nadal odwołujemy się do pola Member przez właściwość), ale w tym przypadku nie mamy explicite obiektu _member wewnątrz klasy, kompilator wygeneruje go anonimowo, pozwalając na dostęp jedynie przez metody get i set.

Aby uczynić pole Member polem „tylko do odczytu” należy:

  • w pierwszym przypadku usunąć metodę set z właściwości:
    class MyClass
    {
        private int _member;
        public int Member
        {
            get { return _member; }
        }
        public MyClass(int value) { _member = value; }
    }
    
  • w drugim przypadku dołożyć przed set słowo kluczowe private:
    class MyClass
    {
        public int Member { get; private set; }
        public MyClass(int value) { Member = value; }
    }
    
  • Przez ten zabieg otrzymujemy pole „tylko do odczytu” dla kodu z zewnątrz klasy.

Be Sociable, Share!
czoper opublikowano dnia 2010-3-13 Kategoria: Programowanie | Tagi:, ,

Odpowiedzi: 2 Zostaw komentarz

  1. #2paszklar @ 2010-4-3 09:44

    Nikt nie każe nikomu używać słowa kluczowego var. Nigdzie. To jest tylko takie uproszczenie, dzięki któremu można nie pisać typu zmiennej gdy w instrukcji jej deklaracji następuje też przypisanie wartości. Kompilator może rozpoznać typ zmiennej dzięki temu przypisaniu, a programista oszczędza na pisaniu typu. Dla typów bool czy int to może nie jest żaden zysk, ale jak masz zmienną Dictionary<TVertex, List<TVertex, IEdge>> (sam ostatnio używałem podobnych potworków przy implementacji klasy grafu) to zysk jest oczywisty. Inna sprawą jest zaciemnianie kodu, np. widząc instrukcję ‚var x = MojaJakasFunkcja();’ nie bardzo wiadomo jakiego typu jest x (choć miły Visual Studio podpowie jak najedziesz kursorem na zmienną lub funkcję). Natomiast żadnego zaciemnienia nie ma w przypadku operatora new, np. ‚var x = new List();’ – wiadomo na pierwszy rzut oka czym jest x, a pisania jest mniej. Czy używać var czy nie to już indywidualny wybór. Ja jako leniwy człowiek w moich własnych projektach piszę var wszędzie gdzie się da 😉

  2. #1Michniewicz @ 2010-3-13 21:41

    Eh… C# był elegancki, a teraz obrasta w „możesz jedną rzecz zrobić na sto różnych sposobów” 🙁

    Na przykład niedawno się dowiedziałem, że w foreach nie powinno się już podawać typu wprost – podobno należy stosować słowo kluczowe var… Na razie nie tego nie robię, póki nie przeczytam czym to grozi i z czym to się je…

    Jeszcze trochę i nawet zmiennych deklarować nie będzie trzeba…

Zostaw odpowiedź

(Ctrl + Enter)