Метод (програмиране): Разлика между версии

Изтрито е съдържание Добавено е съдържание
м Малка корекция по форматирането
списък без {{Br}}, единици по SI; форматиране: 5x интервали (ползвайки Advisor.js)
Ред 90:
 
==Основни правила за създаване и работа на един метод==
1.# Всеки един метод трябва да решава само една точно определена задача. Обособяването като метод на парче код което решава няколко задачи (дори и свързани помежду си) води до затруднена четимост на програмата като цяло и до затруднено редактиране на кода.{{Br}}
2.# Името на метода трябва да е описателно и да отговаря на това, което изпълнява дадения метод. Ако името на метода се получи прекалено дълго това означава че този метод не решава само една задача. Например метод с име GetUserName() е пример за име което описва съвсем ясно какво прави той. Ако при писане на метода стигнете до име от типа на GetUserNameAndPasswordAndCheckInDataBaseForUserDetails() това трябва да ви покаже, че "натоварвате" един метод с повече от една функция.{{Br}}
3.# Един метод трябва да "знае" за "околната среда" точно толкова колкото е необходимо за да може да си свърши работата, и трябва да бъде видим само от методи, които биха могли да имат работа с него. Предаването на масив от данни или структура към метод, който има нужда само от един елемент от тези данни е грешен подход и трябва да се избягва.{{Br}}
4.# Винаги когато в програмата нещо трябва да се извърши на повече от едно място то този код трябва да се обособи в отделен метод. По този начин евентуални бъдещи корекции ще трябва да се направят само в тялото на метода, а не на няколко места в основната програма, или в други методи.
 
==Статични и динамични методи==
В езика C# методите могат да бъдат "привързани" както към даден клас като цяло (статични методи), така и към дадена инстанция (елемент) на дадения клас (динамични методи).Когато метода бъде дефиниран с ключовата дума static пред дефиницията си, то той е статичен. Този метод работи не върху конкретен обект от класа, а върху данни от целия клас.
 
Ако например имаме клас "автомобил" и направим статичен метод за изчисляване на разхода на гориво, то този метод няма да се интересува за кой точно автомобил става въпрос. Той ще очаква да му се подадат като параметри пробега и изразходените литри гориво, и ще връща резултата в литри на 100 кмkm. Така всички обекти, наследници на клас "автомобил" ще могат да изчисляват разхода си, ползвайки този метод.
Можем да извикаме Automobile.GetAverageMPG(miles, gallons) без да му подаваме определен обект от клас "автомобил". Както се забелязва от примера статичния метод се извиква като се укаже името на клас преди името на метода. Статичния метод може да се ползва след първо извикване на метод от дадения клас. Докато нямаме нито един обект от клас "автомобил", нямаме и никакви методи от този клас и опит да извикаме метода ще доведе до грешка при изпълнението на програмата.{{Br}}
 
Можем да извикаме Automobile.GetAverageMPG(miles, gallons) без да му подаваме определен обект от клас "автомобил". Както се забелязва от примера статичния метод се извиква като се укаже името на клас преди името на метода. Статичния метод може да се ползва след първо извикване на метод от дадения клас. Докато нямаме нито един обект от клас "автомобил", нямаме и никакви методи от този клас и опит да извикаме метода ще доведе до грешка при изпълнението на програмата.{{Br}}
 
Динамичните методи за разлика от статичните са "вързани" към точно определен обект на дадения клас, и извършват манипулации въз основа на данните на дадения обект, а не на класа като цяло.
 
Ако имаме два обекта — примерно carA и carB — от клас Automobiles, и всеки от обектите пази в себе си данни за последното показание на километража и заредените литри гориво, тогава извикването на carA.GetAverageMPG() и съответно на carB.GetAverageMPG() ще връща разхода на гориво за конкретния обект, ползвайки данните от обекта. Динамичните методи се извикват чрез добавяне на името на обекта преди името на метода.
 
Line 161 ⟶ 165:
// Когато бъде създаден нов обект от класа MyClass конструктура ще бъде извикан и ще инициализира обекта.
 
public MyClass()
{
x = 5;
Line 172 ⟶ 176:
===Деструктори===
Деструктора е метод, който се извиква автоматично, когато обект от даден клас приключи жизнения си цикъл. Деструкторите се ползват за освобождаване на ресурси заети от обекта или за други задачи свързани с унищожаването на обекта. В повечето езици деструкторите се извикват без параметри и не връщат стойност.
 
В езика C# деструкторите нямат широко приложение, тъй като мениджърът на паметта (garbage collector) има грижата да освободи всеки блок памет, към който не сочи използващ се в момента в програмата указател. Ако някой метод задели определено количество памет за масив или структура от данни, след приключване на работата на метода тази заделена памет остава "висяща", към нея вече не сочи никакъв указател и при следващото минаване garbage collector-а ще я освободи.
 
Но за разлика от паметта, заети други ресурси — например мрежови връзки, файлове или заявки към бази данни — не се освобождават от garbage collector-а и за тяхното освобождаване трябва да се предприемат някакви мерки. Най-често се ползва using структурата, която автоматично затваря всички връзки щом като се изпълни using блока. Пример:{{Br}}
 
<source lang="csharp">
using (StreamReader reader = new StreamReader("input.txt"))
Line 197 ⟶ 204:
// Конструктор на класа, който позволява инициализацията на членовете на класа x и y с зададени параметри.
 
public MyClass(int integer, double floatingpoint)
{
x = integer;
Line 205 ⟶ 212:
public static MyClass operator +(MyClass op1, MyClass op2)
{
return new MyClass(op1.x + op2.x, op1.y * op2.y);
 
// Оператора + за този клас ще връща нов обект от класа, чийто член x ще е равен на сбора от членовете x на двата операнда,
// но члена y ще е равен на умножението на членовете y на двата операнда.