Loading...
EngirooSan avatar EngirooSan 38 Точки

Обекти и класове

Привет,

необходимо ли е да използваме property-та в конструктора на даден клас и ако да защо(защо е грешно ако не ги ползваме)?

Поне аз до сега си създавам полете от тип public и след това си ги инициализирам в конструктора с this.

Ясно е , че property-то ни предпазва от невалидно подадени стойности,примерно char вместо int..не съм го пробвал но и с this. ако към конструктора се подаде невалиден параметър(char вместо int ) би трябвало да хвърли exception...

 

Тагове:
1
Module: C# Advanced
val4o89 avatar val4o89 240 Точки

При използване на публично поле, то е публично едновременно и при гет и при сет, докато в пропъртито можеш да имаш public get и private/ protected etc. set. Другия случай, е когато искаш да направиш някаква валидация примерно при сетването на променливата. Тогва самата валидация си я пишеш в сетъра, което е доста удобно.

2
EngirooSan avatar EngirooSan 38 Точки

Ако говорим за валидация за тип на подаваната стойност ще е излишно нали, тъй като при грешно подадена стойност  към конструктора няма да ни позволи да изпълним кода?

0
val4o89 avatar val4o89 240 Точки

Говоря за валидация в смисъла на if(value < 0) или if(string.IsNullOrEmpry(value)), сеш се :) А това с валидацията по тип... пропъртито има конкретен тип (приерно int), и за това няма как да му вкараш като value друг тип и вътре да го питаш "ма ти int ли си". Същото е, като с методите, ако даден метод връща int, няма как да напишеш return "abc", щото "abc" не е int. Или пък ако приема като параметър string, няма да ти позволи да му подадеш променлива от друг тип. Тия неща най-добре си ги тествай едно по едно, за да видиш точно кво се случва в дадена ситуация. Успех.

0
10/03/2017 10:54:07
EngirooSan avatar EngirooSan 38 Точки

Мерси, ще ги прецъкам за да си ги доизясня :)

0
Tsekova avatar Tsekova 10 Точки

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

class Client
    {
        public string Name { get; set; } // име на клиента
        public Dictionary<string, int> Order { get; set; } // поръчка по артикул и брой
        public decimal Bill { get; set; } // сметка

    }

    class Program
    {
        static void Main(string[] args)

        { ...  }}

Въпросът ми е при съществуващ вече клиент, как да допълня точно неговия Order? Не знам как да достъпя самия речник. Тепърва уча класовете, надявам се че го обясних правилно :D
     

 

0
08/08/2018 15:47:10
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

значи ти ще имаш списък с clients примерно и ще го потърсиш по име като гледам то ти е уникалното

и ще имаш нещо от сорта на 

list<client> clients= new list<client>();

string input= ... четеш името на клиент и поръчката от тук ще вземеш name

var clientIneed= clients.select(x=>x,Name=Name).firstOrdefault(); // или можеш като метод var clientineed=clients.firstordefault(x=>x,name=Name);

if(clientIneed==null){

var client = new client{....} създаваш него и поръчката,явно този клиент е нов и идва сега.

continue;}

ако не ти е null значи вече го имаш и става

clientIneed.order.add(нещо,сума)

и готово. и честно казано аз бих си напавил Bill computed property и ще е нещо от сорта на bill= >order.Sum(x=>x.Values);

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

 

 

0
08/08/2018 16:33:28
Tsekova avatar Tsekova 10 Точки

Аз съм си направила проверка дали клиентът вече съществува. Не знам как да му добавя нова поръчка.

имам си List<Client>clients = ......

string[] input = клиент, поръчка и т.н.

string name = input[0];

if (clients.Any(x => x.Name == name))

{ name.Order.Add(продукт, брой) } ?? не става по този начин

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

ами ти проверяваш само дали го има затова го правиш по моя начин дърпаш си го 

clientineed=clients.firstordefault(x=>x,name=Name);

и после вече през него clientIneed.order.add(нещо сума)

това че същестува не ти е достатъчно ти трябва да го извикаш и създадеш отново за да достъпиш до неговата поръчка и да обновиш state-a които се пази в list-a 

няма как да достъпиш order без да създадеш обекта нали това им е идеята да пазят информацията в себе си класовете и като поискаш да правиш нещо да си ги извикаш с обект и да напълниш каквото ти трябва или направиш каквото ти трябва.

погледни го като в релания живот :Д това че примерно знаеш че имаш кола в хладилника не означава че тя ще се отвори сама нали ще я отидеш и ще си я вземеш и чак тогава тук е същото това че знаеш че нещо съществува не ти дава достъп до него.

0
08/08/2018 17:02:29
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.