static void ValueAndReferenceTypes() { PointVal a; //PointVal a = new PointVal; a.X = 3; a.Y = 5; PointVal b = a; b.X = 7; b.Y = 10; a.LogValue(); b.LogValue(); Console.WriteLine("after structs"); PointRef c = new PointRef(); c.X = 3; c.Y = 5; PointRef d = c; d.X = 7; d.Y = 10; c.LogValue(); d.LogValue(); }
static void ValRefTypesDemo() { // Character c = new Character(); // // c.Hit(120); // // Console.WriteLine(c.Health); // Calculator calc = new Calculator(); // // var square1 = calc.CalcTriangleSquare(20, 20, 30); // var square2 = calc.CalcTriangleSquare(50, 50, 90); // // var rightOrder = calc.CheckOrderOfArgument(10, 20, 1, 1, 1); // var namedRightOrder = calc.CheckOrderOfArgument(arg2: 15, arg1: 10); // // Console.WriteLine(square1); // Console.WriteLine(square2); // // Console.WriteLine(rightOrder); // Console.WriteLine(namedRightOrder); // // if (Calculator.TryDivide(10, 0, out int result)) // { // Console.WriteLine(result); // } // else // { // Console.WriteLine(result); // } PointVal a; a.X = 3; a.Y = 5; PointVal b = a; b.X = 7; b.Y = 10; a.LogValues(); b.LogValues(); Console.WriteLine("After structs"); var o = new PointRef(); o.X = 3; o.Y = 5; var n = o; n.X = 7; n.Y = 10; o.LogValues(); n.LogValues(); }
static void BoxingUnboxing() { PointVal val = new PointVal() { X = 1, Y = 2 }; if (val is PointVal) { Console.WriteLine($"Is PointRef"); } }
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 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 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 (ссылка объекта не указывает на экземляр объекта) }
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(); }