План лекции
• В первый класс• Свойства• Методы• Конструкторы• Интерфейсы
18.04.2023 Толстиков Никита 2Введение
В первый класс
18.04.2023 Толстиков Никита 3Введение
• Создадим класс:В Solution Explorer (Ctrl-Alt-L) -> Add
… Class (Alt-Insert -> Class)
namespace HelloWorld{ public class Monster { }}
Модификаторы доступа
18.04.2023 Толстиков Никита 4Введение
• public – доступ открыт отовсюду• private – сущность доступна только в этом классе• protected – сущность доступна из этого класса и
классов потомков• internal – сущность доступна только из текущей
сборки (assembly)• protected internal – сущность доступена из
текущей сборки или из наследников
По умолчанию действует правило: «Сущность имеет максимально ограниченный доступ пригодный для использования»
Поля
18.04.2023 Толстиков Никита 5Введение
class Monster {
private static int ourMonstersCount = 0; private int myId;private string myName;
}
Свойства
18.04.2023 Толстиков Никита 6Введение
class Monster { private int myId;
public int Id { get { return myId; } set { myId = value; } }
public string Name { get; set; } }
• Одномерный массивы:
• Двумерные массивы:
Массивы
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}};
Массивы
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; } } }
CONST vs READONLY
18.04.2023 Толстиков Никита 9Введение
• const – может быть только примитивный тип и должна быть известна на этапе компиляции
• readonly – может быть любым типом и может быть инициализирована только в конструкторе
Инициализация объекта
18.04.2023 Толстиков Никита 10Введение
static void Main(string[] args) { var monster = new Monster { Id = 1, Name = "My honey monster" }; }
Методы
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){ }
Методы
18.04.2023 Толстиков Никита 12Введение
• Метод типа:Console.WriteLine("Hellow World");
public static void KillAll() {…}
• Методы расширения (extension methods):
static class MonsterUtils { public static int TranslateWords(this Monster monster) { } }
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]; } }
Ref/Out
18.04.2023 Толстиков Никита 14Введение
• ref – передать значение по ссылке как параметр, который будет использоваться
• out – передать значение по ссылке, но параметр не будет использоваться, а только про инициализируется
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]; } }
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);
}
Переопределение операторов
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)
Индексатор
18.04.2023 Толстиков Никита 18Введение
public string this[int i] { get { return KnownWords[i]; } set { KnownWords[i] = value; } }
Конструктор
18.04.2023 Толстиков Никита 19Введение
• Конструктор по умолчанию:
• Конструктор с параметрами:public Monster() { }
public Monster(int id, string name) { Id = id; Name = name; }
Конструктор из конструктора
18.04.2023 Толстиков Никита 20Введение
• Конструктор из конструктора:
public Monster(int id) : this(id, "Default"){ }
Статичный конструктор
18.04.2023 Толстиков Никита 21Введение
• Вызывается при создании объекта типа
• Должен быть без параметровstatic Monster() { }
/// 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 и содержат методы:
Переопределение 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.
Переопределение 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); }
Переопределение ==
18.04.2023 Толстиков Никита 25Введение
• По умолчанию:– Используется для неизменяемых типов– Сравнивает указатели
• Переопределение для изменяемых типов не рекомендуется
The End
18.04.2023 Толстиков Никита 26Введение
Recommended