Created
October 7, 2025 07:20
-
-
Save sunmeat/6c8222bd4930bfd19316137e17e69afa to your computer and use it in GitHub Desktop.
методи класу Object
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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