Классы в С#
Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы] enum имя_перечисления [: базовый класс] {список_возможных_значений} перечисления могут быть объявлены непосредственно в пространстве имен проекта или могут быть вложены в описание класса. Последний вариант часто применяется, когда перечисление используется в одном классе и имеет атрибут доступа private; константы разных перечислений могут совпадать. Имя константы всегда уточняется именем перечисления; константы могут задаваться словами русского языка; разрешается задавать базовый класс перечисления; разрешается задавать начальный элемент подмножества, на которое проецируется множество значений перечисления. enum EmpType { Manager = 10, Grunt = 1,Contractor = 100,VP = 99 }
Базовый класс System.Enum GetUnderlyingType() – возвращает тип данных, используемый для представления числовых значений элементов перечисления: Console.WriteLine(Enum.GetUnderlyingType(typeof(EmpType))); Enum.Format() - возвращает значимые имена элементов перечисления по их числовым значениям : EmpType fred; fred = EmpType.Contractor; Console.WriteLine("You area {0}, Enum.Format(typeof(EmpType), fred, "G")); GetValues() - возвращает экземпляр System.Array, где каждому элементу массива соответствует член указанного перечисления : Array obj = Enum.GetValues(typeof(EmpType)); foreach(EmpType e in obj) { Console.Write("String name: {0}", Enum.Format(typeof(EmpType), e, "G")); Console.Write( ({0})", Enum.Format(typeof(EmpType), e, "D")); } свойство IsDefined- позволяет определить, является ли выбранная вами символьная строка элементом указанного перечисления if(Enum.IsDefined(typeof(EmpType), "SalesPerson"))...
Структуры в С# могут определять конструкторы (только принимающие параметры); могут реализовывать интерфейсы; могут содержать любое количество внутренних членов. [атрибуты][модификаторы] struct имя_структуры [:список_интерфейсов] {тело_структуры} struct Employee { public EmpType title; // Одно из полей – перечисление public string name; public short deptID; } class StructTester { public static int Main(string[] args) { Employee fred; fred.deptID = 40; fred.name = "Fred"; fred.title = EmpType.Grunt; return 0; }
struct Employee { public EmpType title; public string name; public short deptID; // Конструктор public Employee (EmpType et, string n, short d) { title = et; name = n; deptID = d; } class StructTester { public static int Main(string[] args) { // Для вызова конструктора используется ключевое слово new Employee maгу =new Employee (EmpType.VP, "Mary", 10); return 0; } public void Displ ayEmpStats (Employee e) { Console.WriteLine(Here is {0}\'s info:", e.name); Console.WriteLine("Department ID: {0}", e.deptID); Console.WriteLine(Title: {0}", Enum.Format(typeof(EmpType), e.title, "G")); } Конструкторы в структурах
Упаковка и распаковка в структурах // Создаем и упаковываем нового сотрудника Employee stan = new Employee (EmpType.Grunt, "Stan", 10); object stanlnBox = stan; public void UnboxThisEmployee(object о) { // Распаковка в структуру Employee для получения доступа ко всем полям Employee temp = (Employee)o; Console.WriteLine(temp.name + "is alive!"); } Вызов метода: // Передаем упакованного сотрудника на обработку t.UnboxThisEmployee(stanlnBox); Можно и так. Происходит автоматическая упаковка. t.UnboxThisEmployee(stan); Передаем упакованны й объект
Методы класса [атрибуты][модификаторы]{void| тип_результата_функции} имя_метода([список_формальных_аргументов]) { тело метода} Список формальных аргументов разделяются на группы: входные, выходные обновляемые. [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); }
Классы [атрибуты][модификаторы] class имя_класса [:список_родителей] {тело_класса} Модификаторы: new, abstract, sealed, private, protected, public, internal В теле класса могут быть объявлены: константы; поля; конструкторы и деструкторы; методы; события; делегаты; классы (структуры, интерфейсы, перечисления).
class Employee { private string fullName; private int empID; private float currPay; public Employee() {} public Employee(string fullName, int empID, float currPay) { this. fullName = fullName; this.empID = empID; this. currPay = currPay; } public void GiveBonus(float amount) { currPay += amount; } public virtual void DisplayStats() { Console. WriteLine("Name: {0}", fullName); Console.WriteLine(Pay: {0}", currPay); Console.WriteLine(ID: {0}", empID); } public static void Main() { Employee e = new Employee(Joe", 80, 30000); e.GiveBonus(200); Employee e2; e2 = new Employee("Beth", 81, 50000); e2.GiveBonus(1000); e2.DisplayStats(); }
Методы-свойства Стратегии доступа к полю: чтение, запись (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); }
Конструкторы и деструктор Person pers1 = new Person(); Person pers3= new Person("Петрова"); static Person(){ Console.WriteLine("Выполняется статический конструктор!"); } ~Person(){ //Код деструктора }