Методы классов
Методы класса [атрибуты][модификаторы] {void|тип_результата_функции} имя_метода ([список_формальных_аргументов]) { тело метода} Список формальных аргументов разделяются на группы: входные, выходные - out обновляемые - ref [ref|out|params] тип_аргумента имя_аргумента
Перегрузка методов void A(out long p2, int p1) { p2 =(long) Math.Pow(p1,3); Console.WriteLine("Метод A-1"); } void A(out long p2, params int[] p) { p2=0; for(int i=0; i
Функции с побочным эффектом Функция называется функцией с побочным эффектом, если помимо результата, вычисляемого функцией и возвращаемого ей в операторе return, она имеет выходные аргументы с ключевыми словами ref и out. int f(ref int a) { return(a++); } public void TestSideEffect() { // тестирование int a = 0, b=0, c=0; a =1; b = a + f(ref a); a =1; c = f(ref a)+ a; Console.WriteLine("a={0}, b={1}, c={2}",a,b,c); }
Методы-свойства Стратегии доступа к полю: чтение, запись (Read, Write); чтение, запись при первом обращении (Read, Write- once); только чтение (Read-only); только запись (Write-only); ни чтения, ни записи (Not Read, Not Write).
public class Person { string fam="", status="", health=""; int age=0, salary=0; public string Fam {//Чтение, запись при первом обращении set {if (fam == "") fam = value;} get {return(fam);} } public string Status {//Только чтение get {return(status);} } public int Age { //Чтение, запись set { age = value; if(age < 7) status ="ребенок"; else if(age
Индексаторы ….. const int Child_Max = 10; //максимальное число детей Person[] children = new Person[Child_Max]; int count_children=0; //число детей public Person this[int i] {//индексатор get { if (i>=0 && i< count_children) return(children[i]); else return(children[0]); } set { if (i==count_children && i< Child_Max) { children[i] = value; count_children++; } public int Count_children { get {returm (count_children);} }
public void TestPersonChildren(){ Person pers1 = new Person(), pers2 = new Person(); pers1.Fam = "Петров"; pers1.Age = 42; pers1.Salary = 10000; pers1[pers1.Count_children] = pers2; pers2.Fam ="Петров"; pers2.Age = 21; pers2.Salary = 1000; Person pers3= new Person("Петрова"); pers1[pers1.Count_children] = pers3; pers3.Fam ="Петрова"; pers3.Age = 5; Console.WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status); Console.WriteLine ("Сын={0}, возраст={1}, статус={2}", pers1[0].Fam, pers1[0].Age, pers1[0].Status); Console.WriteLine ("Дочь={0}, возраст={1}, статус={2}", pers1[1].Fam, pers1[1].Age, pers1[1].Status); }
Списочные структуры данных
Абстрактные классы public abstract class Stack{ public Stack() {} public abstract void put(int item); public abstract void remove(); public abstract int item(); public abstract bool IsEmpty(); }
Реализация стека на однонаправленном списке Узел списка public class Linkable{ public Linkable() { } public int info; public Linkable next; }
public class ListStack: Stack{ public ListStack() { top = new Linkable(); } Linkable top; public override void put(int item) {// втолкнуть элемент item в стек Linkable newitem = new Linkable(); newitem.info = item; newitem.next = top; top = newitem; } public override void remove() {// удалить элемент в вершине стека top = top.next; } public override int item() {// прочитать элемент в вершине стека return(top.info); } public override bool IsEmpty() {// определить, пуст ли стек return(top.next == null); } public void TestStack(){ ListStack stack = new ListStack(); stack.put(7); stack.put(9); Console.WriteLine(stack.item()); stack.remove(); Console.WriteLine(stack.item()); stack.put(11); stack.put(13); Console.WriteLine(stack.item()); stack.remove(); Console.WriteLine(stack.item()); if(!stack.IsEmpty()) stack.remove(); Console.WriteLine(stack.item()); }