Loading...
bacuty avatar bacuty 55 Точки

[КПК] Използване на var вместо конкретен тип?

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

Има ли нещо като конвецния за използването на var вместо конкретен тип . Лично аз го ползвам по-скоро "интуитивно" и не много често. Като например в посочената задача на мен лично ми идва в повече :).

Поздрави,

Василена

П.С. :Весели празници :)!

Тагове:
1
C# OOP Advanced
Filkolev avatar Filkolev 4482 Точки

Ползвай го както прецениш. Основното, което трябва да имаш предвид, е четимостта на кода.

Има случаи, в които е добре да го предпочетеш пред изричната декларация на типа: IOrderedEnumerable<KeyValuePair<string, int>> sortedDictionary = dictionary.OrderBy(x => x.Value). Имаш някакъв речник и го сортираш. При обхождане няма да забележиш разлика с обикновен речник, а въпросният тип, освен че е дълъг за изписване, може да е объркващ.

Други случаи, в които аз бих предпочел var, е когато типът е дълъг или когато е очевидно какво има отдясно. var Student = new Student(), тук няма как да се объркам и да не разбера, че работя със студент.

Понякога е по-добре да изпишеш изрично с какво работиш ако не е съвсем очевидно. Рядко ми се е случвало, но е имало подобни ситуации; искам да е ясно, че работя с IEnumerable, а не с List примерно; трудно ми е да се сетя за конкретен пример.

Когато правиш имплицитно кастване няма как да ползваш var, защото компилаторът ще вземе типа по подразбиране на израза отдясно: long num = 5, няма как да го смениш с var num, защото 5 е int. Или трябва да посочиш типа отляво, или да кастнеш експлицитно 5-цата.

Друга ситуация е в рамките на foreach когато искаш да кастнеш. Най-ярък пример е при работа с регекс и мачове в MatchCollection. Тази колекция не е генерична, т.е. може да се пусне на foreach, но компилатора не знае всеки елемент какъв тип е. Ако ползваш стандартния запис с var в рамките на цикъла ще боравиш с object, затова може вместо var да ползваш реалния тип на обектите в колекцията, който е Match, което е кастване (ако колекцията е от нещо друго, а не от обекти тип Match, ще се хвърли грешка). Пример: foreach(Match match in matches) ... вместо foreach(var match in matches); при второто match ще е object.

2
enevlogiev avatar enevlogiev 1168 Точки

Едно от скритите предимства на var е, че те учи да си именуваш променливите правилно. Ако някой ти погледне кода и веднага разбере кое какъв тип е, значи всичко е наред.

Виждал съм хора, които предпочитат да пишат Int32 вместо int, това лично мен ме чопли като карфичка под ноктите.

2
RoYaL avatar RoYaL Trainer 6849 Точки

Случаи, в които не бих избрал "var" са когато искам нещо да е изрично от определен тип или негов наследник, а не негов супертип.

var предразполага към много скрит полиморфизъм (duck typing), който не винаги е желан ефект.

Например ако имам следната структура:

- class Person

- class Student extends Person

- class Teacher extends Person

- class OnlineStudent extends Student

- class OnsiteStudent extends Student

Всички от които имат метод "Breath()".

и редовете:

var teen = new Student();

teen.Breath();

Нищо не ми пречи да заменя дясната част на Teacher(); Само че де факто това, което съм искал да напиша е, че искам в променливата "teen" да се съдържат само студенти. Било то просто студенти, онлайн студенти или присъствени студенти. А де факто съм позволил на хората да сложат всеки един тип, който има метод Breath().

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

 

 

5
Filkolev avatar Filkolev 4482 Точки

Good point.

Да речем имаш структурата: IPerson, IEnrollable и IStudent : IPerson, IEnrollable.

Ако напишеш var student = new Student() получаваш променлива тип Student. В зависимост от това какво искаш да правиш с тази променлива може отдясно да сложиш нещо по-абстрактно, IPerson, IStudent или IEnrollable. Това може да покаже някаква допълнителна информация на четящия кода каква е функцията на променливата, как смяташ да я използваш (в случая дали се интересуваш от студента като човек, студент или просто искаш в даден момент да му викнеш метода Enroll()).

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