Когда есть необходимость в поле, не предполагающем изменения, наиболее рациональным вариантом кажется объявление его с использованием ключевого слова
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
Anonymous Quiz
33%
false
11%
true
11%
null
44%
-1
👍1
out).📖 Кортежи изначально появились в C# 4.0 и были представлены типом
System.Tuple.Позднее, в версии C# 7.0 был добавлен новый тип
System.ValueTuple. На данный момент рекомендуется использовать именно его ввиду повышенной производительности. public (string, int) GetFruit()
{
return ("Apple", 5);
}
По умолчанию имена полей кортежа имеют следующий вид:
(string, int) fruit = GetFruit();
//fruit.Item1, fruit.Item2
public (string Name, int Count) GetFruit()
{
return ("Apple", 5);
}
var cort = (bob.Name, bob.Age);
Console.WriteLine(cort.Name);
Метод позволяет получить свойства объекта по-отдельности:
(string name, int number) = GetFruit();
// в результате - 2 отдельные переменные name и number
#tuple
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2🤔1🤯1
main() | c#, patterns & stuff pinned «Hello, world! Привет! На этом канале я буду выкладывать посты об особенностях платформы .NET через призму языка C# — синтаксис, конструкции, концепции и прочее. Разложим по полочкам паттерны проектирования (design patterns). Изучим базу и полезные фишки распределённой…»
Все ключевые слова C#, представляющие названия типов, — это псевдонимы для определённого типа .NET из библиотеки базовых классов BCL.
string — псевдоним типа System.String,
int — псевдоним типа System.Int32.
👍 Если и так всё знал,
🔥 Если ты Вий, и тебе подняли веки,
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😁3🦄3🤡1