Clear        


                
                    using System.Globalization;

namespace _05_IDisposableAndFinalizers
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region Finalizer
            // 1) kategorimizi oluşturuyoruz
            Kategori kategori = new Kategori()
            {
                Id = 1,
                Adi = "Bilgisayar",
                Aciklamasi = "Masaüstü ve dizüstü bilgisayarlar"
            };

            // 2) kategorimizi ekrana yazdırıyoruz
            Console.WriteLine($"KATEGORİ\nAdı: {kategori.Adi}\nAçıklaması: {kategori.Aciklamasi}");
            #endregion



            Console.WriteLine();



            #region IDisposable
            // 1) ürünümüzü oluşturuyoruz
            Urun urun1 = new Urun(1, "ASUS ROG Laptop", 50000, 100);

            // 2) ürünümüzü ekrana C2 (currency, parabirimi ve ondalıktan sonra iki hane) ile Türkçe bölgesel ayarına göre yazdırıyoruz
            Console.WriteLine($"ÜRÜN\nId: {urun1.Id}\nAdı: \"{urun1.Adi}\"\n" +
                $"Birim Fiyatı: {urun1.BirimFiyati.ToString("C2", new CultureInfo("tr-TR"))}\nStok Miktarı: {urun1.StokMiktari} adet");

            // 3) ürünümüz ile işimiz bittiği için çöpe atıyoruz (dispose ediyoruz), her zaman IDisposable implemente edilip Dispose methodu kullanılması zorunlu değildir
            urun1.Dispose();



            // 1) ürünümüzü oluşturuyoruz
            Urun urun2 = new Urun()
            {
                Id = 2,
                Adi = "HP Omen Laptop",
                BirimFiyati = 60000,
                StokMiktari = 50
            };

            // 2) ürünümüzü ekrana C2 (currency, parabirimi ve ondalıktan sonra iki hane) ile İngilizce bölgesel ayarına göre yazdırıyoruz
            Console.WriteLine($"PRODUCT\nId: {urun2.Id}\nName: \"{urun2.Adi}\"\n" +
                $"Unit Price: {urun2.BirimFiyati.ToString("C2", new CultureInfo("en-US"))}\nStock Amount: {urun2.StokMiktari} unit(s)");

            // 3) ürünümüz ile işimiz bittiği için çöpe atıyoruz (dispose ediyoruz), her zaman IDisposable implemente edilip Dispose methodu kullanılması zorunlu değildir
            urun2.Dispose();

            // Objeyi dispose etmek yerine referans değişkenini null atamak (örneğin urun2 = null;) doğru bir yöntem değildir.
            // Bu işlem objeyi hafızadan temizlemez, sadece referans değişkeni ile obje arasındaki bağlantıyı kaldırır.
            // Artık bu referans değişkeni üzerinden işlem yapıldığında Null Reference Exception hatası fırlatılacaktır.
            #endregion
        }
    }
}