Skip to content

Instantly share code, notes, and snippets.

View sunmeat's full-sized avatar
🐈
MEOW

Oleksandr Zahoruiko sunmeat

🐈
MEOW
View GitHub Profile
@sunmeat
sunmeat / info.md
Created October 28, 2025 12:02
клас GC

У бібліотеках базових класів доступний клас на ім'я System.GC, який дозволяє програмно взаємодіяти зі збирачем сміття за рахунок звернення до його статичних членів. Необхідність у безпосередньому використанні цього класу в розроблюваному коді виникає надзвичайно рідко (а то й взагалі ніколи). Зазвичай єдиним випадком, коли потрібно застосовувати члени System.GC, є створення класів, що передбачають використання на внутрішньому рівні некерованої пам'яті. Це може бути, наприклад, клас, що працює з інтерфейсом Windows API на основі C за рахунок застосування протоколу викликів платформи .NET, або якась низькорівнева та складна логіка взаємодії з COM. Управління збором сміття Збирач сміття .NET призначений переважно для того, щоб керувати пам'яттю замість розробників. Однак у дуже рідкісних випадках потрібно примусово запустити збір сміття за допомогою методу GC.Collect(). Приклади таких ситуацій наведено нижче:

  • Додаток приступає до виконання блоку коду, переривання якого можливим процесом збору сміття є неприпус
@sunmeat
sunmeat / info.md
Last active October 28, 2025 11:59
кореневі елементи в дот нет 9

Збірка сміття в .NET: Визначення моменту, коли об'єкт більше не потрібен

Розгляньмо питання про те, як збирач сміття визначає момент, коли об'єкт більше не потрібен. Щоб розібратися в деталях, що стоять за цим, необхідно знати, що таке кореневі елементи додатка (application roots). Простіше кажучи, кореневим елементом (root) називається комірка в пам'яті, в якій міститься посилання на об'єкт, розміщений у купі. Суворо кажучи, кореневими можуть називатися елементи будь-якої з наведених нижче категорій:

  • Посилання на глобальні об'єкти (хоча в C# вони не дозволені, CIL-код дозволяє розміщувати глобальні об'єкти).
  • Посилання на будь-які статичні об'єкти або статичні поля.
  • Посилання на локальні об'єкти в межах кодової бази додатка.
  • Посилання на об'єкти, що передаються як параметри методу.
  • Посилання на об'єкти, що очікують фіналізації.
  • Будь-які регістри центрального процесора, які посилаються на об'єкт.
@sunmeat
sunmeat / Program.cs
Created October 27, 2025 13:39
parallel collections C#
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
@sunmeat
sunmeat / Program.cs
Created October 27, 2025 13:27
special collections C#
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Text;
class Program
{
@sunmeat
sunmeat / Program.cs
Created October 27, 2025 12:56
generic collections C#
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
@sunmeat
sunmeat / Program.cs
Created October 27, 2025 12:43
non-generic collections C#
using System.Collections;
using System.Text;
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
ArrayListDemo();
@sunmeat
sunmeat / task.md
Last active October 25, 2025 12:38
ДЗ на узагальнення

Створіть generic клас Spellbook, де T — тип заклинання, що реалізує інтерфейс ISpell з методами Cast() та GetPower(). Застосуйте комбіновані constraints: where T : ISpell, new(), IComparable для сортування заклинань за силою, і додайте метод LearnSpell(), що додає нові заклинання з перевіркою на унікальність через IComparable.

У Main() створіть Spellbook з вигаданими заклинаннями (клас Fireball та HealingWave, обидва з ISpell), або по Гарі Потеру. вивчіть 5 заклинань, відсортуйте та симулюйте кастування найсильнішого, виводячи ефекти. Додайте умовні constraints через where T : class для "темних" заклять (з додатковим інтерфейсом IDarkMagic), і метод InvokeRitual(), що комбінує заклинання лише якщо всі T задовольняють IDarkMagic, інакше кидає виняток. Тестуйте з мішаними типами в окремій Spellbook.

@sunmeat
sunmeat / Program.cs
Last active October 25, 2025 12:27
технічні відмінності
// 1. універсальні шаблони мови C# не забезпечують такої ж гнучкості, як шаблони мови C++.
// наприклад, неможливо викликати арифметичні оператори в універсальному класі мови C#,
// хоча можна викликати оператори, визначені користувачем.
public class MyClass<T>
{
public T Add(T a, T b)
{
return (dynamic)a + (dynamic)b; // коли використовуються dynamic, компілятор відкладає перевірку типів до часу виконання.
// це дозволяє використовувати оператор + для будь-яких типів, які підтримують цей оператор, але також вимагає,
@sunmeat
sunmeat / Program.cs
Created October 25, 2025 12:05
generic interface C#
using System;
using System.Text;
namespace GenericInterfaceExample
{
public interface IPrintable<T> where T : struct
{
void Print();
}
@sunmeat
sunmeat / Program.cs
Created October 25, 2025 11:46
constraints C#
using System.Text;
namespace GenericClassExample2
{
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/where-generic-type-constraint
class Box<T> where T : class, new()
{
protected T innerObject;
public Box()