Балуюсь в сирешотку 25.02.2025
Всем привет! Скучно, и хочу баловаться в современную сирешотку.
Структуры...
using System; public class Program { struct Зверь { public String кличка; public int возраст; public void Вывод() => Console.WriteLine($"Меня зовут {кличка}, и мне {возраст} года/лет."); } public static void Main(string[] args) { Зверь кошка = new Зверь {кличка = "Муся", возраст = 2}; Зверь медведь = кошка with { кличка = "Мишаня"}; кошка.Вывод(); медведь.Вывод(); } }
Результат:
Меня зовут Муся, и мне 2 года/лет. Меня зовут Мишаня, и мне 2 года/лет.
Улучшу код...
using System; public class Program { struct Зверь { public String кличка; public int возраст; private String ГодИлиГода() => возраст > 0 && возраст < 2 ? $"год." : $"года."; private String ПроверкаВозраста() => возраст < 5 ? $"{возраст} {ГодИлиГода()}" : $"{возраст} лет."; public void Вывод() => Console.WriteLine($"Меня зовут {кличка}, и мне {ПроверкаВозраста()}"); } public static void Main(string[] args) { Зверь кошка = new Зверь {кличка = "Муся", возраст = 2}; Зверь медведь = кошка with { кличка = "Мишаня"}; Зверь собака = new Зверь { кличка = "Стиф", возраст = 1}; Зверь кошка2 = new Зверь { кличка = "Люся", возраст = 5}; кошка.Вывод(); медведь.Вывод(); собака.Вывод(); кошка2.Вывод(); } }
Результат:
Меня зовут Муся, и мне 2 года. Меня зовут Мишаня, и мне 2 года. Меня зовут Стиф, и мне 1 год. Меня зовут Люся, и мне 5 лет.
Возвращение множество значений. В Python и в PHP можно возвращать несколько значений без массива или объекта.
В PHP так:
<?php function getInformation() { return array("Антон", "Попов", 43); } list ($str_firstname, $str_lastname, $int_age) getInformation(); echo sprintf("%s %s %s", $str_firstname, $str_lastname, $int_age); ?>
А в Python вот так:
def get_information(): return "Антон", "Попов", 43 firstname, lastname, age = get_information() print(firstname, lastname, age)
В C# так, нужно чтобы были методы статичкскими:
Так:
using System; public class Program { static Tuple<String, String, Int32> ПолучитьИнформациюОЧеловеке() { return Tuple.Create("Антон", "Попов", 43); } public static void Main(string[] args) { var person = ПолучитьИнформациюОЧеловеке(); Console.WriteLine($"{person.Item1} {person.Item2} {person.Item3}"); } }
Или вот так:
using System; public class Program { static Tuple<String, String, Int32> ПолучитьИнформациюОЧеловеке() { return new Tuple<String, String, Int32>("Антон", "Попов", 43); } public static void Main(string[] args) { var person = ПолучитьИнформациюОЧеловеке(); Console.WriteLine($"{person.Item1} {person.Item2} {person.Item3}"); } }
Результат:
Антон Попов 43
Нет в Python вот так:
def get_information(): return ["Антон", "Попов", 43] firstname, lastname, age = get_information() print(firstname, lastname, age)
Опечатка в PHP вот так:
<?php function getInformation() { return array("Антон", "Попов", 43); } list ($str_firstname, $str_lastname, $int_age) getInformation(); echo sprintf("%s %s %d", $str_firstname, $str_lastname, $int_age); ?>
Именованные параметры/аргументы, вот примет:
public class Program { class Зверь { public String кличка; public int возраст; public Зверь() {} public Зверь(String кличка, int возраст) { this.кличка = "Боб"; this.возраст = возраст; } public void УстановитьЗначения(String кличка, int возраст) { this.кличка = "Боб"; this.возраст = возраст; } private String ГодИлиГода() => возраст > 0 && возраст < 2 ? $"год." : $"года."; private String ПроверкаВозраста() => возраст < 5 ? $"{возраст} {ГодИлиГода()}" : $"{возраст} лет."; public void Вывод() => Console.WriteLine($"Меня зовут {кличка}, и мне {ПроверкаВозраста()}"); } public static void Main() { Зверь кот = new Зверь(); кот.УстановитьЗначения(кличка:"Боб", 1); кот.Вывод(); } }
Результат:
Меня зовут Боб, и мне 1 год.
А можно теперь делать вот так:
... Зверь кот = new Зверь(); кот.УстановитьЗначения(кличка:"Боб", возраст:1); кот.Вывод(); кот.УстановитьЗначения("Боб", возраст:1); кот.Вывод(); ...
Результат:
Меня зовут Боб, и мне 1 год. Меня зовут Боб, и мне 1 год.
Полный код:
public class Program { class Зверь { public String кличка; public int возраст; public Зверь() {} public Зверь(String кличка, int возраст) { this.кличка = кличка; this.возраст = возраст; } public void УстановитьЗначения(String кличка, int возраст) { this.кличка = кличка; this.возраст = возраст; } private String ГодИлиГода() => возраст > 0 && возраст < 2 ? $"год." : $"года."; private String ПроверкаВозраста() => возраст < 5 ? $"{возраст} {ГодИлиГода()}" : $"{возраст} лет."; public void Вывод() => Console.WriteLine($"Меня зовут {кличка}, и мне {ПроверкаВозраста()}"); } public static void Main() { Зверь кот = new Зверь(); кот.УстановитьЗначения(кличка:"Боб", 1); кот.Вывод(); кот.УстановитьЗначения("Боб", возраст:1); кот.Вывод(); кот.УстановитьЗначения(кличка:"Боб", возраст:1); кот.Вывод(); } }
Результат работы программы:
Меня зовут Боб, и мне 1 год. Меня зовут Боб, и мне 1 год. Меня зовут Боб, и мне 1 год.
Типы значений допускающие значение NULL. Обычно как, если в переменной значение NULL, то происходит ошибка, чтобы не было ошибки нужно писать блок try-catch. В C# имхо где-то начиная с версии 4.0 можно писать так тип_данных?, например int? age, string? firstname; вот пример:
using System; public class Program { class Человек { public String? Имя { get; set; } public String? Фамилия { get; set; } } public static void Main(string[] args) { Человек чел = new Человек() { Имя = "Антон", Фамилия = null}; Человек чел2 = new Человек() { Имя = null, Фамилия = "Попов"}; Console.WriteLine($"{чел.Имя} {чел.Фамилия}"); Console.WriteLine($"{чел2.Имя} {чел2.Фамилия}"); } }
Результат:
Антон Попов
Ещё пример, где может реально произойти ошибка, пример с математической операцией:
using System; public class Program { public static void Main(string[] args) { int? a = 3; int? b = null; int? c = a + b; Console.WriteLine($"{a}+{b}={c}"); } }
Результат:
3+=
Продолжу баловаться. В Visual Basic и в Си++ в MFC есть такия функции/методы Left, Right, Mid. В C# этот метод называется Substring.
Вот к примеру:
using System; public class Program { public static void Main(string[] args) { String мишка = "Мишка медведь"; Console.WriteLine($"{мишка.Substring(0, 5)}"); } }
Результат:
Мишка
В Visual Basic и в PHP есть функция split, и explode (для Visual Basic, для PHP) в C# есть метод Split.
Пример:
using System; public class Program { public static void Main(string[] args) { String мишка = "Мишка медведь"; String[] результаты = мишка.Split(' '); foreach(var р in результаты) Console.WriteLine($"{р}"); } }
Результат:
Мишка медведь
Поговорим про события в C#. Вот один из примеров для вызова события:
using System; public class Program { public class СобытиеМедведьКушает : EventArgs {} public interface ИнтерфейсМедведь { event EventHandler<СобытиеМедведьКушает> МедведьКушает; } public class Медведь : ИнтерфейсМедведь { public event EventHandler<СобытиеМедведьКушает> МедведьКушает; public void Кормить() { МедведьКушает.Invoke(this, new СобытиеМедведьКушает()); } } public static void КушайМишка(object sender, СобытиеМедведьКушает с) { Console.WriteLine("Мишка кушает!"); } public static void Main(string[] args) { Медведь мишка = new Медведь(); мишка.МедведьКушает += КушайМишка; мишка.Кормить(); мишка.Кормить(); } }
Результат:
Мишка кушает! Мишка кушает!
В C# так-же как и в Java чтобы знать равна строка нужно использовать метод Equals. Если написать так:
using System; public class Program { public static void Main(string[] args) { String строка = "Миша"; if(строка.Equals("Миша") == true) Console.WriteLine("Да, это миша"); else Console.WriteLine("Нет, это не миша"); if(строка.ToLower().Equals("миша") == true) Console.WriteLine("Да, это миша"); else Console.WriteLine("Нет, это не миша"); } }
То результат такой:
Да, это миша Да, это миша
А если же вот так написать:
using System; public class Program { public static void Main(string[] args) { String строка = "миша"; if(строка.Equals("Миша") == true) Console.WriteLine("Да, это миша"); else Console.WriteLine("Нет, это не миша"); if(строка.ToLower().Equals("миша") == true) Console.WriteLine("Да, это миша"); else Console.WriteLine("Нет, это не миша"); } }
То результат такой:
Нет, это не миша Да, это миша
Теперь поииграемся в LINQ:
Вот код:
using System; using System.Linq; public class Program { public enum ПОЛ { Самка, Самец }; class Зверюшка { public int Зоопарк_ID { get; set; } public ПОЛ Пол { get; set; } public String Кличка { get; set; } public int Возраст { get; set; } } class Зоопарк { public int Зоопарк_ID { get; set; } public String Название { get; set; } public String Город { get; set; } } public static void Main(string[] args) { Зверюшка[] зверюшки = {new Зверюшка() { Зоопарк_ID = 1, Пол = ПОЛ.Самка, Кличка = "Пушинка", Возраст = 3}, new Зверюшка() { Зоопарк_ID = 1, Пол = ПОЛ.Самец, Кличка = "Медвежонок", Возраст = 1} }; Зоопарк[] зоопарки = { new Зоопарк() { Зоопарк_ID = 1, Город = "Марсианская впадена", Название = "Зоопарк \"марсианской впадене\"" } }; var результат = from зо in зоопарки join зв in зверюшки on зо.Зоопарк_ID equals зв.Зоопарк_ID select new { зо.Город, зо.Название, зв.Пол, зв.Кличка, зв.Возраст } ; foreach(var р in результат) { Console.WriteLine($"город = {р.Город}, название зоопарка = {р.Название}" + $", пол зверюшки = {р.Пол}, кличка зверюшки = {р.Кличка}, " + $"возраст зверюшки = {р.Возраст}"); } } }
а вот результат работы кода:
город = Марсианская впадена, название зоопарка = Зоопарк "марсианской впадене", пол зверюшки = Самка, кличка зверюшки = Пушинка, возраст зверюшки = 3 город = Марсианская впадена, название зоопарка = Зоопарк "марсианской впадене", пол зверюшки = Самец, кличка зверюшки = Медвежонок, возраст зверюшки = 1