Hello, world!
Привет!
На этом канале я буду выкладывать посты об особенностях платформы .NET через призму языка C# — синтаксис, конструкции, концепции и прочее. Разложим по полочкам паттерны проектирования (design patterns). Изучим базу и полезные фишки распределённой системы контроля версий GIT.
В перспективе здесь будут рассматриваться и другие языки/технологии, к примеру, React, Flutter и иже с ними.
Ну и мимо мемасиков мы не проходим.
Поэтому присоединяйтесь — а я постараюсь, чтобы здесь было полезно, эффективно и лампово! ❤️
Привет!
На этом канале я буду выкладывать посты об особенностях платформы .NET через призму языка C# — синтаксис, конструкции, концепции и прочее. Разложим по полочкам паттерны проектирования (design patterns). Изучим базу и полезные фишки распределённой системы контроля версий GIT.
В перспективе здесь будут рассматриваться и другие языки/технологии, к примеру, React, Flutter и иже с ними.
Ну и мимо мемасиков мы не проходим.
Поэтому присоединяйтесь — а я постараюсь, чтобы здесь было полезно, эффективно и лампово! ❤️
👏2❤1
Базовые принципы проектирования
1️⃣ Выделить и инкапсулировать аспекты приложения, которые могут измениться
2️⃣ Программировать на уровне интерфейсов, а не реализаций
3️⃣ Композиция (отношение СОДЕРЖИТ) предпочтительнее наследования (отношение ЯВЛЯЕТСЯ)
4️⃣ Стремиться к слабой связанности взаимодействующих объектов
5️⃣ Класс должен быть закрытым для изменений, но открытым для расширений
Разумеется, это далеко не все принципы. Далее будем рассматривать и другие принципы, а также указанные выше — более подробно
#patterns, #principles
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
👀 если просто посмотреть
Разумеется, это далеко не все принципы. Далее будем рассматривать и другие принципы, а также указанные выше — более подробно
#patterns, #principles
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👀2👍1
🔥2👍1
Статическая, сильная и слабая типизация
Типы из пространства имён
Типы из пространства имён
#типизация
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
👀 если просто посмотреть
Типы из пространства имён
System.Collections имеют статическую типизацию, но содержат слабо типизированные элементы System.ObjectТипы из пространства имён
System.Collections.Generic также имеют статическую типизацию, но содержат сильно типизированные элементы типа <T>#типизация
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1👀1
Когда есть необходимость в поле, не предполагающем изменения, наиболее рациональным вариантом кажется объявление его с использованием ключевого слова
const. Тем не менее, константы следует использовать осторожно, поскольку у них есть 2 недостатка:
1️⃣ значение константы должно быть известно во время компиляции,
2️⃣ значение константы должно выражаться в виде литеральной строки.
В большинстве случаев предпочтительным вариантом будет использование ключевого слова
readonly. Поле, объявленное как readonly, инициализируется так же всего 1 раз, но не на этапе компиляции, в отличие от констант.Есть 2 причины, по которым
readonly предпочтительнее const:#readonly, #const
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👀1
Принцип проектирования
Выделить и инкапсулировать аспекты приложения, которые могут измениться
Ситуация.
Сидите себе, никого не трогаете, пишете метод
Собственно, придётся класс переделывать и прятать детали реализации (откуда брать специфические мемы для разных поколений) в соответствующие подклассы — иначе беда.
Если в процессе проектирования или уже разработки приложения вы понимаете, что определённый аспект кода в будущем будет изменяться, например, с введением новых требований, то его надо отделить от неизменных аспектов — инкапсулировать.
Это позволит в будущем легко подменять одну реализацию другой, что приводит нас уже к другому принципу, но об этом в следующий раз.
#principles
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
👀 если просто посмотреть
Выделить и инкапсулировать аспекты приложения, которые могут измениться
Ситуация.
Сидите себе, никого не трогаете, пишете метод
DisplayMeme() в заботливо созданном классе MemeShower, который показывает мемы для миллениалов. И тут вам сообщают, что вообще-то ваш класс должен использоваться ещё и для показа мемов зумерам, иксерам и, прости господи, альфам.Собственно, придётся класс переделывать и прятать детали реализации (откуда брать специфические мемы для разных поколений) в соответствующие подклассы — иначе беда.
Если в процессе проектирования или уже разработки приложения вы понимаете, что определённый аспект кода в будущем будет изменяться, например, с введением новых требований, то его надо отделить от неизменных аспектов — инкапсулировать.
Это позволит в будущем легко подменять одну реализацию другой, что приводит нас уже к другому принципу, но об этом в следующий раз.
#principles
👍 Если и так всё знал,
🔥если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2👀1
🧹 Финализатор (он же деструктор) — метод завершения, который освобождает ресурсы, то есть уничтожает объект.
Финализатор пишется без модификатора доступа, его имя совпадает с именем класса, перед которым ставится знак тильды (~).
public class Goo
{
public Goo() // конструктор
{
// выделение ресурсов
}
~Goo() // финализатор
{
// здесь освобождаются неуправляемые ресурсы
}
}
💣 Деконструктор — возвращает объект, разбитый на составные части. Метод использует синтаксис C# для деконструкции, например, для работы с кортежами.
public class Goo
{
public string Name {get;set;}
public int Age {set;get;}
// деконструктор
public void Deconstruct(out string gooName, out byte gooAge)
{
gooName = Name;
gooAge = Age;
}
}
// Создание объекта
Goo goo = new();
// использование деконструктора в кортеж
var (name, age) = goo;
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Квиз тайм!
Где выделяется память для поля значимого типа (например, DateTime), если это поле находится в объекте ссылочного типа (например, определённый пользователем класс Goo)?
Где выделяется память для поля значимого типа (например, DateTime), если это поле находится в объекте ссылочного типа (например, определённый пользователем класс Goo)?
Anonymous Quiz
40%
В стэке
10%
На жОском диске
40%
В куче
10%
Пёс его знает
👍2🔥1🤡1
Ну а размеры кэша вы легко можете проверить в спецификации своего процессора
#stackoverflow
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👀1
Квиз тайм!
Как расшифровывается JSON?
Как расшифровывается JSON?
Anonymous Quiz
12%
Japanese SON
0%
Java SingletON
29%
Jason Statham Object Notation
6%
Java Super Object Name
53%
Java Script Object Notation
😁4👍3🦄1😎1
💾 База
Значимые типы (типы значения) хранятся в стеке. К ним относятся:
🔘 типы чисел
🔘 char, DateTime, bool
🔘 Color, Point, Rectangle
Ссылочные типы хранятся в куче. В стеке хранится лишь адрес объекта ссылочного типа.
❗️ Если объект ссылочного типа (хранящийся в куче, мы помним) имеет поле значимого типа (DateTime, например), то значение DateTime будет хранится тоже в куче (!)
‼️ Если объект значимого типа (хранящийся в стеке), имеет поле ссылочного типа (например, string), то значение string будет храниться где? Правильно, в куче!
#stack, #heap
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👀1
Квиз тайм!
Чем отличется string и String?
Чем отличется string и String?
Anonymous Quiz
27%
Размером хранимой строки🤔
9%
string — потомок String🤔
55%
string — псевдоним типа String🤔
9%
Просто дай знать ответ 🤨
👍2🤡2🤯1
ulong?Формально, самое большое целое число, которое может храниться в типе .NET и у которого в C# есть свой псевдоним
ulong, составляет порядка 18.5 квинтиллионов (да, это дофига).👀 Но 7-классникам-криптоинвесторам каких-то жалких 20 разрядов в числе недостаточно, чтобы хранить заработанные денюжки, поэтому пацанам из микрософта пришлось придумать тип
BigInteger, что в пространстве имён System.Numerics.💪 Этот бро вообще не видит краёв, в прямом смысле слова — у
BigInteger формально нет минимального и максимального значения. Он парсится из строки и может быть абсолютно любым целочисленным значением.Создать и инициализировать переменную типа
BigInteger можно с помощью следующего фрагмента кода:using System.Numerics;
BigInteger bigBro = BigInteger.Parse("5034750347508734805738945789346597346");
#bignumbers
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👀3👍2🔥2
Anonymous Quiz
0%
Separate(...) 😿
75%
Split(...) 😿
8%
Segregate(...) 🤨
17%
Unmerge(...) 🤣
👍3
