Уютное сообщество C# разработчиков
2.51K subscribers
44 photos
53 links
Уютное сообщество C# - обучающий канал для разработчиков.

Полезные материалы по языку программирования.
Тесты на знание C#
Подсказки и трюки языка

@aldrson @viktorreh
加入频道
3 причины использовать DateTimeOffset вместо DateTime

Если что-то из этого вам подходит стоит задуматься о смене используемого типа данных 🤔

Необходимо проверить, что из следующего вашему приложению нужно:

1️⃣ Уникально и однозначно определять единый момент во времени.
В системе появится недвусмысленное понятие «сейчас», можно будет логгировать временные метки транзакций, событий, созданий, модификаций и так далее.

2️⃣ Выполнение общих арифметических операций над датой и временем с высокой точностью.
Например, прибавляете к некоторой дате шесть месяцев, и ожидаемый результат должен получиться с поправкой на летнее время.

3️⃣ Хранение нескольких связанных между собой меток времени, как частей одной структуры или одного массива данных.

#полезное #tips
🔥8👍7👎3💩2🤮1
Самый редко используемый цикл в C#

Цикл do while редко используется, но важно помнить о его существовании, чтобы понимать возможные случаи применения.

Его синтаксис таков:

do
{
// тело цикла
} while (condition)

Этот цикл всегда исполняет своё тело как минимум один раз, даже если условие не выполнено.

Из этой особенности, отличающей do while от других видов циклов, вытекают его основные сценарии использования.

А как часто вы используете do while?

#полезное #tips
👍12💩2😢1
Какие циклы существуют в языке C#?
Anonymous Quiz
84%
for, while, do while, foreach
2%
for
1%
for, while
3%
for, while, do while
9%
for, while, foreach
4👎3🤮2💩2
"Стоит ли использовать foreach, если for быстрее?"

Здесь важно понимать, чем отличаются эти циклы.

▪️for - это классический управляющий оператор, который транслируется в +/- одинаковый IR или машинный код практически во всех языках программирования согласно блок-схеме выше.

Принцип его работы одинаков везде:
for (выражение1; выражение2; выражение3)
оператор

▪️foreach
- это синтаксический сахар над итераторами, который ещё и работает согласно принципам утиной типизации.
Перебираемому объекту даже не обязательно реализовывать IEnumerable.

Разворачивается такой цикл примерно в следующее:
var enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext())
{
var item = enumerator.Current;
// ...
}

Невооружённым глазом видно, что здесь происходит вызов через VMT, возможен cast, выделение памяти и так далее.
Обслуживание foreach очевидно дороже, потому что это абстракция.

Так что использование везде for вместо foreach - скорее микрооптимизация.

#полезное #tips
👍8🔥42
В последнее время часто приходится работать с enum.

Многим известно, что enum это тип значения, определённый набором именованных констант, в каких случаях его удобно использовать и так далее.

Но сегодня хочется рассказать о хорошей, как мне кажется, практике проектирования перечисления.

Создавая новое перечисление, старайтесь предоставлять значение по умолчанию.

Иначе default(TEnum) может вернуть первое значение из перечисления, что может приводить к логическим несостыковкам и смысловым ошибкам.

Конечно, так надо делать только в соответствии с описываемой предметной областью.
Такое значение может называться None, Default или Unknown.

Такая структура enum позволит описать, как работать с вашим пользовательским типом данных.

#полезное #tips
👍22
Где верно происходит вывод данных в консоль?
Anonymous Quiz
4%
Console.write("Hi");
2%
сonsole.log("Hi");
93%
Console.WriteLine("Hi");
1%
print("Hi");
😁16🤡5🍓2😴2
Что покажет код на картинке?
Anonymous Quiz
12%
00
9%
11
13%
01
47%
12
20%
Ошибку в коде
👎13👍6💩62🤮1
Внезапная задача

Найдите отличия в приведённых фрагментах кода, и в каком из них находится баг?

1️⃣

var children = _childrenRepository.GetByParentIds(parentIds);
return parentIds.ToDictionary(
parentId => parentId,
parentId => children.Where(child => child.ParentId == parentId).ToList());

2️⃣

var children = _childrenRepository.GetByParentIds(parentIds);
var grouped = children.GroupBy(child => child.ParentId);
return grouped
.ToDictionary(
childrenGroup => childrenGroup.Key,
childrenGroup => childrenGroup.ToList());
👎6👍2💩2
Ответ: дело в том, что во втором случае теряется информация: в итоговом словаре не будет родительских сущностей с пустой коллекцией дочерних.
👍3👎3🤔2🤡1
Возможно вы не знали этот метод LINQ

С 6-ой версии в .NET присутствует метод Chunk, который позволяет дробить коллекцию на одинаковые кусочки, так называемые "чанки".

// получаем итерируемый объект
var enumerable = Enumerable.Range(1, 999);

// дробим на чанки
var chunks = enumerable.Chunk(29);

// итерируем по чанкам
foreach(var chunk in chunks) // для каждого чанка
{
foreach(var item in chunk) // для каждого элемента в чанке
{
Console.WriteLine(item);
}
}

Пользуйтесь на здоровье!

#полезное #tips
🔥25👍122
Что из нижеперечисленного не может иметь модификатор virtual?
Anonymous Quiz
12%
Свойства
33%
Поля
43%
Индексаторы
12%
Методы
👍8