26
Толстиков Никита [email protected] Создание типов 21.03.2022 1 Введение

Net Framework и С#, весна 2015: Собственные типы

Embed Size (px)

Citation preview

Page 1: Net Framework и С#, весна 2015: Собственные типы

Толстиков Никита[email protected]

Создание типов

18.04.2023 1Введение

Page 2: Net Framework и С#, весна 2015: Собственные типы

План лекции

• В первый класс• Свойства• Методы• Конструкторы• Интерфейсы

18.04.2023 Толстиков Никита 2Введение

Page 3: Net Framework и С#, весна 2015: Собственные типы

В первый класс

18.04.2023 Толстиков Никита 3Введение

• Создадим класс:В Solution Explorer (Ctrl-Alt-L) -> Add

… Class (Alt-Insert -> Class)

namespace HelloWorld{ public class Monster { }}

Page 4: Net Framework и С#, весна 2015: Собственные типы

Модификаторы доступа

18.04.2023 Толстиков Никита 4Введение

• public – доступ открыт отовсюду• private – сущность доступна только в этом классе• protected – сущность доступна из этого класса и

классов потомков• internal – сущность доступна только из текущей

сборки (assembly)• protected internal – сущность доступена из

текущей сборки или из наследников

По умолчанию действует правило: «Сущность имеет максимально ограниченный доступ пригодный для использования»

Page 5: Net Framework и С#, весна 2015: Собственные типы

Поля

18.04.2023 Толстиков Никита 5Введение

class Monster {

private static int ourMonstersCount = 0; private int myId;private string myName;

}

Page 6: Net Framework и С#, весна 2015: Собственные типы

Свойства

18.04.2023 Толстиков Никита 6Введение

class Monster { private int myId;

public int Id { get { return myId; } set { myId = value; } }

public string Name { get; set; } }

Page 7: Net Framework и С#, весна 2015: Собственные типы

• Одномерный массивы:

• Двумерные массивы:

Массивы

18.04.2023 Толстиков Никита 7Введение

int[] array;int[] array = new int[100];int[] array = new int[] {1, 2, 3};

int[,] squareArray; or int[][] squareArray;int[,] squareArray = new int[10,5];int[,] squareArray = {{1,2,3},{4,5,6},{7,8,9}};

Page 8: Net Framework и С#, весна 2015: Собственные типы

Массивы

18.04.2023 Толстиков Никита 8Классы

class Monster { private int myId;

public int Id { get { return myId; } set { myId = value; } }

public string Name { get; set; }

string[] myKnownWords = new string[] { "Argh", "Need more minerals", "My life for Aiur!" };

public string[] KnownWords { get { return myKnownWords; } } }

Page 9: Net Framework и С#, весна 2015: Собственные типы

CONST vs READONLY

18.04.2023 Толстиков Никита 9Введение

• const – может быть только примитивный тип и должна быть известна на этапе компиляции

• readonly – может быть любым типом и может быть инициализирована только в конструкторе

Page 10: Net Framework и С#, весна 2015: Собственные типы

Инициализация объекта

18.04.2023 Толстиков Никита 10Введение

static void Main(string[] args) { var monster = new Monster { Id = 1, Name = "My honey monster" }; }

Page 11: Net Framework и С#, весна 2015: Собственные типы

Методы

18.04.2023 Толстиков Никита 11Введение

• Метод объекта:public void Die() { }

• Перегрузка методов:public void Kill(int monsterId) { }

public void Kill(Monster monsterId) { }

• Параметры по умолчанию:public void Kill(Monster monsterId, bool withViolence =

true){ }

Page 12: Net Framework и С#, весна 2015: Собственные типы

Методы

18.04.2023 Толстиков Никита 12Введение

• Метод типа:Console.WriteLine("Hellow World");

public static void KillAll() {…}

• Методы расширения (extension methods):

static class MonsterUtils { public static int TranslateWords(this Monster monster) { } }

Page 13: Net Framework и С#, весна 2015: Собственные типы

Ref/Out

18.04.2023 Толстиков Никита 13Введение

static class MonsterUtils { //Метод находит любимое слово

// и количество его повторений public static string MostLovelyWorld(

this Monster monster,int count) // НО КАК ЖЕ ВЕРНУТЬ КОЛ-ВО???

{ int index = 0; int maxCount = 0; //ищем слово и кол-во его повторений return monster.KnownWords[index]; } }

Page 14: Net Framework и С#, весна 2015: Собственные типы

Ref/Out

18.04.2023 Толстиков Никита 14Введение

• ref – передать значение по ссылке как параметр, который будет использоваться

• out – передать значение по ссылке, но параметр не будет использоваться, а только про инициализируется

Page 15: Net Framework и С#, весна 2015: Собственные типы

Ref/Out

18.04.2023 Толстиков Никита 15Введение

static class MonsterUtils { //Метод находит любимое слово

// и количество его повторений public static string MostLovelyWorld(

this Monster monster,int out count)

{ int index = 0; int maxCount = 0; //ищем слово и кол-во его повторений return monster.KnownWords[index]; } }

Page 16: Net Framework и С#, весна 2015: Собственные типы

Ref/Out

18.04.2023 Толстиков Никита 16Введение

static void Main(string[] args) { var monster = new Monster { Id = 1, Name = "My honey monster" };

string lovelyWord; int lovelyWordCount;

lovelyWord = monster.MostLovelyWorld(out lovelyWordCount);

}

Page 17: Net Framework и С#, весна 2015: Собственные типы

Переопределение операторов

18.04.2023 Толстиков Никита 17Введение

• С большой силой приходит большая ответственность: «не перегружайте операторы, если это нарушает очевидную семантику»

public static Monster operator +(Monster m1, Monster m2)public static Monster operator ++(Monster one)public static int operator <(Monster one, Monster two)public static int operator >(Monster one, Monster two)public static bool operator false(Monster one)public static explicit operator Monster(int i)public static implicit operator Monster(int i)

Page 18: Net Framework и С#, весна 2015: Собственные типы

Индексатор

18.04.2023 Толстиков Никита 18Введение

public string this[int i] { get { return KnownWords[i]; } set { KnownWords[i] = value; } }

Page 19: Net Framework и С#, весна 2015: Собственные типы

Конструктор

18.04.2023 Толстиков Никита 19Введение

• Конструктор по умолчанию:

• Конструктор с параметрами:public Monster() { }

public Monster(int id, string name) { Id = id; Name = name; }

Page 20: Net Framework и С#, весна 2015: Собственные типы

Конструктор из конструктора

18.04.2023 Толстиков Никита 20Введение

• Конструктор из конструктора:

public Monster(int id) : this(id, "Default"){ }

Page 21: Net Framework и С#, весна 2015: Собственные типы

Статичный конструктор

18.04.2023 Толстиков Никита 21Введение

• Вызывается при создании объекта типа

• Должен быть без параметровstatic Monster() { }

Page 22: Net Framework и С#, весна 2015: Собственные типы

/// Returns a string that represents the current objectpublic virtual string ToString()

/// The exact runtime type of the current instance.public Type GetType()

/// Determines whether the specified object instances are equal.public virtual bool Equals(object obj)

/// Serves as a hash function for a particular type.public virtual int GetHashCode()

// Allow an object to free resources before the object is reclaimed by the GC.protected virtual void Finalize()

// Returns a new object instance that is a memberwise copyprotected Object MemberwiseClone();

Методы от Object

18.04.2023 Толстиков Никита 22Введение

• Все наследуются от System.Object и содержат методы:

Page 23: Net Framework и С#, весна 2015: Собственные типы

Переопределение Equals

18.04.2023 Толстиков Никита 23Введение

• Инвариант:– x.Equals(x) возвращает true

(рефлексивность)– x.Equals(y) возвращает тоже самое, что и y.Equals(x) (симметричность)

– Если x.Equals(y) && y.Equals(z) то x.Equals(z) (транзитивность)

– x.Equals(y) dвозвращает тоже самое значение пока x или у не изменятся

– x.Equals(null) возвращает false.

Page 24: Net Framework и С#, весна 2015: Собственные типы

Переопределение Equals

18.04.2023 Толстиков Никита 24Введение

public override bool Equals(Object obj) { // If parameter is null return false. if (obj == null) { return false; } // If parameter cannot be cast to Point return false. Monster m = obj as Monster; if (m == null) { return false; } // Return true if the fields match: return (Id == m.Id) && (Name == m.Name); }

public bool Equals(Monster m) { if (m == null) { return false; } // Return true if the fields match: return (Id == m.Id) && (Name == m.Name); }

Page 25: Net Framework и С#, весна 2015: Собственные типы

Переопределение ==

18.04.2023 Толстиков Никита 25Введение

• По умолчанию:– Используется для неизменяемых типов– Сравнивает указатели

• Переопределение для изменяемых типов не рекомендуется

Page 26: Net Framework и С#, весна 2015: Собственные типы

The End

18.04.2023 Толстиков Никита 26Введение