Връзка между Field, Constructor, Property


1

Здравейте,

от самото начало на ООП курса си задавам един въпрос и до сега, нито от колеги, нито в интернет намирам окончателен отговор (какъвто всъщност може и да липсва).

Най-просто - когато създаваме field/property - към кое от двете трябва да сочи нашия constructor, какво значение има и кое в какви ситуации се използва?

Примерен код:

Constructor сочи към field

Constructor сочи към property

Благодаря!


в C# OOP от roc07 (60 точки)


Отговори



1

Зависи от случая но повечето пъти ще искаш да слагаш стойност на пропъртито, защото най-вероятно повечето пъти ще има логика за проверка в пропъртито.

Виж долу примера ако директно придаваш стойност на field-a няма да се направи проверка а ако дадеш стойност на property-то то тогава програмата ще хвърли грешка ако дължината на стойността е по-малка от 5 :)

private string name;

public string Name

{

        get

        {

             return this.name;

        }

        set

       {
            if(value.Length < 5) 

           {

             throw new ArgumentOutOfRangeException("Name is too short");

             }

             else

            {

             this.name = value;

            }

       }


от Merhatt (1406 точки)


0
Съгласна съм с коментара на колегата. Наред с възможността да провервяш данните, които да се записват в полето, използването на пропърти позволява и да управляваш как да се вземат и задават стойностите. Полето ти е private, а пропъртито - public, съответно всяко записване и достъпване на стойности става само и единствено чрез пропъртито. Така си защитаваш данните от неадекватна промяна заради грешен код някъде. 

от Slavka74 (436 точки)


1

Зависи дали искаш да правиш валидация или не:

-Ако искаш да валидираш входните данни правиш поле и пропърти.

-Ако не е нужна валидация , може пак да направиш поле и пропърти , но ако искаш да спестиш код правиш автоматично пропърти в този случай.Не е грешно във всеки един случай да правиш и поле и пропърти.

-> Конструкторите се използват при създаване на обекти.Когато създаваш обект от тип "Котка" ти подаваш някакви входни данни за да може да създадеш котката - име,цвят,пол,порода,години.Конструкторът поема тези входни данни и ги разпределя в класа по пропъртитата , за да може да претърпят някаква валидация.Примерно ако не въведеш име да ти изпищи , че не може да е без име котката.

В конструктора насочваш входните данни да минават през пропъртито , за да може да се валидира и чак след това ако мине валидацията, да се подаде като стойност на полето!Като самото пропърти подава стойността на полето, след издържаната валидация.

Ощо взето диаграмата е такава Конструктор -> Пропърти -> Поле

Освен да се върнеш и да гледаш лекция номер 1 , не знам какъв друг съвет да ти давам.Изпита е след 5 дена и ще трябва да се стегнеш доста :D


от encho.enevski (316 точки)


0

До колкото знам, добрата практика е конструкторът да сочи към property винаги когато може. Аз винаги го правя така поради причините, които другите колеги изказаха, а и заради случая когато, ако в момента нямаш валидация в property-то и един ден сложиш, кодът ти пак ще работи.

Единственият случай, в който инициализирам полето директно от конструктора е когато самото поле е readonly и няма друг начин да му се зададе стойност, тъй като през property не може в този случай.


от vasilv (275 точки)


0
Освен логика за валидация, пропъртито дава възможност и за друга логика - например някаква математически формули между други пропъртита и/или полето. Пропъртито е почти равноправен метод - функционалност. Държи се като променлива, но зад него седи някаква логика!

от mitkop (578 точки)