static void ValRefTypesDemo() { EvilStruct es1 = new EvilStruct(); //es1.PointRef = new PointRef() { X = 1, Y = 2 }; //es1.PointRef.X = 1; //es1.PointRef.Y = 2; EvilStruct es2 = es1; Console.WriteLine($"es1.PointRef.X={es1.PointRef.X}, es1.PointRef.Y={es1.PointRef.Y}"); Console.WriteLine($"es2.PointRef.X={es2.PointRef.X}, es2.PointRef.Y={es2.PointRef.Y}"); es2.PointRef.X = 42; es2.PointRef.Y = 45; Console.WriteLine($"es1.PointRef.X={es1.PointRef.X}, es1.PointRef.Y={es1.PointRef.Y}"); Console.WriteLine($"es2.PointRef.X={es2.PointRef.X}, es2.PointRef.Y={es2.PointRef.Y}"); Console.ReadLine(); PointVal a; //same as PointVal a = new PointVal(); a.X = 3; a.Y = 5; PointVal b = a; b.X = 7; b.Y = 10; a.LogValues(); b.LogValues(); Console.WriteLine("After structs"); PointRef c = new PointRef(); c.X = 3; c.Y = 5; PointRef d = c; d.X = 7; d.Y = 10; c.LogValues(); d.LogValues(); }
static void DoWithObj(object obj) { //проверить что лежит в object можно с помощью //ключевых слов is и as bool isPointRef = obj is PointRef; if (isPointRef) { PointRef pr = (PointRef)obj; Console.WriteLine(pr.X); } else { //do something } PointRef pr2 = obj as PointRef; //если object - PointRef type, //то сразу произойдет кастование //PointRef pr2 = (PointRef)obj; }
static void NRE_NullReferenceException() { PointVal?pv = null; if (pv.HasValue) { PointVal pv2 = pv.Value; Console.WriteLine(pv.Value.X); Console.WriteLine(pv2.X); } else { // } PointVal pv3 = pv.GetValueOrDefault(); PointRef c = null; Console.WriteLine(c.X); //NullReferenceException }
static void Do(object obj) { bool isPointRef = obj is PointRef; if (isPointRef) { PointRef pr = (PointRef)obj; Console.WriteLine(pr.X); } else { //do smth. } PointRef pr1 = obj as PointRef; if (pr1 != null) { Console.WriteLine(pr1.X); } else { } }
static void NRE_NullableValTypesDemo() { //PointVal pv; //присвоить null невозможно //nullable PointVal type PointVal?pv = null; if (pv.HasValue) //если не null { PointVal pv2 = pv.Value; Console.WriteLine(pv.Value.X);//если не использовать if, будет NullReferenceException //или Console.WriteLine(pv2.X); } //если pv3 == null, то мы получим экземпляр по умолчанию PointVal pv3 = pv.GetValueOrDefault(); //мы не выделили память для с в куче PointRef c = null; Console.WriteLine(c.X); //NullReferenceException (ссылка объекта не указывает на экземляр объекта) }
public EvilStruct(int x, int y) { X = x; Y = y; PointRef = new PointRef(); }
static void Main(string[] args) { Character warrior = new Character("Human"); //У каждого класса свое предназначение, Класс кошка не может создавать ракеты... string charactierInfo = warrior.GetRace(); warrior.Hit(35); Console.WriteLine($"Ваша раса: {charactierInfo}, Здоровье персонажа: {warrior.GetHealth()}, Броня: {warrior.armor}"); Character archer = new Character("Wood Elf", 60); int armorInfo = archer.armor; Console.WriteLine($"Ваша раса: {archer.GetRace()}, Здоровье персонажа: {archer.GetHealth()}, Броня: {armorInfo}"); Calculator calc = new Calculator(); double result = calc.SqrtLength(ab: 8, bc: 12, alpha: 45); //Именованные аргументы Ctrl + .(точка). Выбираем add argument -> result = Math.Round(value: result, digits: 2); Console.WriteLine("Площадь равна: " + result); double avg = calc.Average(numbers: new int[] { 1, 2, 3, 4 }); //инициализация массива Average (именованные аргументы) Console.WriteLine("Среднее значение: " + avg); //С помощью params можно передавать значения массива через запятую double avg2 = calc.Average2(1, 2, 3, 4); //инициализация массива Average. Console.WriteLine("Инициализация среднего значения: " + avg2); // Calculator.TryParsed(); //С использованием статического метода, без использования экземпляра Calculator divider = new Calculator(); if (divider.TryDevide(5, 2, out double result2)) { Console.WriteLine($"Результат деления равен: {result2}"); } else { Console.WriteLine("Fail не получилось поделить"); } //Создадим экземпляр структуры PointVal a; //это экземпляр структуры, тоже самое, что и PointVal a = new PointWal(); a.x = 5; a.y = 8; //Создадим еще одну структуру b PointVal b = a; b.x = 4; b.y = 6; a.LogValues(); b.LogValues(); Console.WriteLine("Данные после struct (структуры)"); //Создадим Экземпляр для класса PointRef c = new PointRef(); c.x = 5; c.y = 8; //Создадим еще одну структуру b PointRef d = c; d.x = 4; d.y = 6; c.LogValues(); d.LogValues(); List <int> list = new List <int>(); AddNumbers(list); foreach (int value in list) { Console.WriteLine("Вывод List " + value); } Swap(8, 6); // SwapAuto(); //Значения вводит пользователь // SwapFromFull(); //С защитой от дурака //Bankomat наследование inheritence ModelA terminalA = new ModelA(252); terminalA.Connect(); ModelB terminalB = new ModelB(758); terminalB.Connect(); //Car наследование Car1 bmw = new Car1("Bmw", "Black", 2.6, 289.7); bmw.CarInfo(); Car2 dodge = new Car2("Dodge", "Yellow", 6.0, 382.3); dodge.CarInfo(); Console.WriteLine(); //Полиформизм (1 метод для каждого класса осуществляет свою операцию папка Polymorphism) Rectangle rectangle = new Rectangle(width: 17.5, height: 22.3); rectangle.Area(); rectangle.Perimeter(); rectangle.Draw(); Console.WriteLine(); Triangle triangle = new Triangle(a: 5.2, b: 6.3, c: 7.5); triangle.Area(); triangle.Perimeter(); triangle.Draw(); Console.WriteLine(); Console.WriteLine(); /*Так как мы переопределили все эти методы, вызывающий код может унифицированно работать со всеми этими типами/классами * используя базовый класс/абстрактный, записать экземпляр абстрактного класса можно в виде массива и передать туда наши * классы - наследники в этот массив*/ Shapes[] shapes = new Shapes[2]; shapes[0] = new Triangle(6.3, 8.2, 9.7); shapes[1] = new Rectangle(22.4, 18.7); //Пройдемся foreach, используя базовый(абстрактный класс) foreach (var shape in shapes) { shape.Area(); shape.Draw(); shape.Perimeter(); } Console.WriteLine(); Console.WriteLine(); Do(triangle); MyStack <int> ms = new MyStack <int>(); //у нас 2 перегрузки массива (по умолчанию 4 элемента), либо выбрать размер какой необходим ms.Push(1); ms.Push(2); ms.Push(3); Console.WriteLine(ms.Peek()); //Выведем последний добавленный элемент ms.Pop(); //удалим последний элемент Console.WriteLine(ms.Peek()); ms.Push(3); ms.Push(4); ms.Push(5); //чтобы произошло расширение стека, чтобы убедиться, что ничего не падает Console.WriteLine(ms.Peek()); //Вадим Шванов ShvanovCar shamovCar = new ShvanovCar(); shamovCar.CarInfo(); ShvanovCar shCar = new ShvanovCar("F1", 260); shCar.CarInfo(); RandomNumbers(); }