Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created October 7, 2025 07:20
Show Gist options
  • Save sunmeat/6c8222bd4930bfd19316137e17e69afa to your computer and use it in GitHub Desktop.
Save sunmeat/6c8222bd4930bfd19316137e17e69afa to your computer and use it in GitHub Desktop.
методи класу Object
using System.Text;
/*
в дот нет усі типи, включно з простими типами даних та користувацькими типами
(класи, структури, перелічення тощо), є похідними від базового класу system.object
цей клас є частиною простору імен system і надає низку загальних методів та функціональності для всіх об'єктів у c#
методи класу object:
a. ToString() - повертає рядкове представлення об'єкта
за замовчуванням цей метод повертає ім'я типу об'єкта
b. Equals(object obj) - слугує для порівняння об'єктів на рівність
у базовій реалізації він порівнює посилання на об'єкти,
і в більшості випадків його слід перевизначати в похідних класах для коректного порівняння вмісту об'єктів
c. GetHashCode() - повертає геш-код об'єкта
цей метод також часто перевизначається в похідних класах,
щоб забезпечити відповідність правилам рівності та гешування
перевизначення методів equals та gethashcode у похідних класах має сенс, коли об'єкти мають
бути коректно використані в колекціях, таких як dictionary або hashset,
де використовується хешування для забезпечення швидкого доступу та пошуку
d. GetType() - повертає об'єкт system.type, що представляє тип поточного об'єкта
e. MemberwiseClone() - створює поверхневу копію поточного об'єкта
f. ReferenceEquals(object obj1, object obj2) - статичний метод для перевірки, чи посилаються
два об'єкти на один екземпляр (порівняння посилань)
g. Finalize() - метод для очищення ресурсів перед garbage collection
в .net 9+ рекомендується використовувати IDisposable з using для детермінованого очищення
*/
class CustomObject
{
public int Value { get; }
public string Name { get; }
public CustomObject(int value, string name)
{
Value = value;
Name = name;
}
// перевизначення ToString для користувацького рядкового представлення
public override string ToString()
{
return $"користувацький об'єкт: значення {Value}, ім'я {Name}";
}
// перевизначення Equals для порівняння за значенням, а не посиланням
public override bool Equals(object? obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
// порівняння вмісту: значення value та name
CustomObject other = (CustomObject)obj;
return Value == other.Value && Name == other.Name;
}
// перевизначення GetHashCode для узгодженості з equals
public override int GetHashCode()
{
return HashCode.Combine(Value, Name);
}
}
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
// створення двох об'єктів object для демонстрації базових методів
object obj1 = new object();
object obj2 = new object();
object obj3 = obj1;
// Equals: базово порівнює посилання, false для різних об'єктів
bool areEqual = obj1.Equals(obj2);
Console.WriteLine($"об'єкти obj1 та obj2 рівні (equals): {areEqual}");
// ReferenceEquals: статичний метод для точного порівняння посилань
bool refEqual = ReferenceEquals(obj1, obj2);
Console.WriteLine($"об'єкти obj1 та obj2 посилаються на один (referenceequals): {refEqual}");
bool refEqualSame = ReferenceEquals(obj1, obj3);
Console.WriteLine($"об'єкти obj1 та obj3 посилаються на один (referenceequals): {refEqualSame}");
// отримання геш-коду
int hash1 = obj1.GetHashCode();
int hash2 = obj2.GetHashCode();
Console.WriteLine($"геш-код obj1: {hash1}, obj2: {hash2}");
// рядкове представлення: за замовчуванням тип
var str1 = obj1.ToString();
Console.WriteLine($"рядкове представлення obj1: {str1}");
// отримання типу
Type type = obj1.GetType();
Console.WriteLine($"тип об'єкта obj1: {type.FullName}");
Console.WriteLine($"чи є абстрактним: {type.IsAbstract}");
// створення користувацьких об'єктів для демонстрації перевизначень
CustomObject custom1 = new CustomObject(42, "Олександр");
CustomObject custom2 = new CustomObject(42, "Олександр");
CustomObject custom3 = new CustomObject(100, "Марія");
// ToString перевизначено
Console.WriteLine($"рядкове представлення custom1: {custom1}");
// Equals перевизначено: true за значенням
bool customEqual = custom1.Equals(custom2);
Console.WriteLine($"custom1 та custom2 рівні (equals): {customEqual}");
bool customNotEqual = custom1.Equals(custom3);
Console.WriteLine($"custom1 та custom3 рівні (equals): {customNotEqual}");
// GetHashCode узгоджено: однакові хеші для рівних об'єктів
int customHash1 = custom1.GetHashCode();
int customHash2 = custom2.GetHashCode();
Console.WriteLine($"хеш custom1: {customHash1}, custom2: {customHash2}");
// демонстрація в колекціях: hashset уникає дублікатів завдяки equals та hashcode
var hashSet = new HashSet<CustomObject> { custom1, custom2, custom3 };
Console.WriteLine($"розмір hashset: {hashSet.Count}"); // 2, бо custom1 == custom2
// Dictionary: ключі за hashcode та equals
var dictionary = new Dictionary<CustomObject, string>
{
{ custom1, "перший запис" },
{ custom2, "другий запис" } // перезапише, бо ключі рівні
};
Console.WriteLine($"значення для custom1: {dictionary[custom1]}"); // "другий запис"
// finalize: в .net 9+ не рекомендується, але для демонстрації (викликається gc)
// custom1.Finalize(); // protected, не викликається явно; GC.Collect() може прискорити
Console.WriteLine("finalize викликається garbage collector'ом перед видаленням, не явно");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment