Kayıtlar

Kasım, 2022 tarihine ait yayınlar gösteriliyor

Class vs Object

Class(sınıf), veriye erişime belirleyen, veriyi saklayan ve verileri işleyen yapılardır. Object(nesne), sınıflardan oluşur. Aralarındaki önemli farklar : Class tanımlandıktan sonra otomatik olarak kullanılmaz. Instance'ı alındığı zaman object oluşmuş olur. Dolayısıyla classlar soyuttur, objectler somuttur. Class metodlar ile objectlerin davranışlarını, değişkenleri ile nesnelerin durumlarını temsil ederler.

Generic ile Non-Generic Koleksiyonlar

Generic koleksiyonlar, tek veri tipinde değer saklayabilir. "System.Collection.Generic" namespaceinden beslenir. Tek tip değer saklaması kötü gözüksede, "Strong Typed" yani tip güvenliği sağlar. ArrayList, SortedList, Stack, Queue ve Hashtable generic koleksiyonlardır. Non-Generic koleksiyonlar, birden fazla veri tipinde değerler saklayabilirler. "System.Collection" namespace'inden beslenir. "Strong Typed" yani tip güvenliği sağlamadığı için dönüşüm yapılırken hata alınabilir. List<T>,Dictionary<TKey,TValue>,SortedList<TKey,TValue>,Queue<T>,Stack<T> ve Hashset<T> generic olmayan koleksiyonlardır.

Array, Multidimensional Array, Jagged Array ve ArrayList

Array : Diziler tek tipteki birden fazla veriyi saklamaya yarar. Referans tipidir. Kapladığı yer sakladığı veriye göre hesaplanır. Multidimensinal Array : Çok boyutlu dizi, aynı tipteki birden fazla katmanlı veriyi saklamaya yarar. Jagged Array :   Array içinde array kullanımıdır. ArrayList : Array mantığının aynısıdır. Diğerlerinden farklı olarak boyutu değiştirilebilir ve tek tip değerler tutmak zorunda değildir.

Döngüler (For, Foreach, Break/Continue)

Döngüler, liste halindeki datalar üzerindeki işlemlerde veya bir işin belli bir miktarda yapılmasını sağlayan yapılardırç For ve Foreach ağırlıklı olarak kullanılır. For döngüsü, datayı bildiğimiz durumlarda kullanılmalıdır. Ayrıca indeks ile değerini bulabileceğimiz sınıflarda kullanılır.(Array, Dictionary vs...) Aksi durumlarda hata verdirir. 20 adet verisi olan bir listeyi, döngüde 30 kere döndürürsek 21. işlemde hata alırız. Foreach döngüsü, datayı bilmediğimiz veya propertyleri kolay olumak için kullanılmalıdır.  Performans açısından For daha performanslı gözüksede, programda kullanılan class/viewmodel/dto gibi elementler büyüdükçe Foreach kullanımı daha anlamlı olacaktır. Aralarındaki fark hiçbirzaman string/stringbuilder etkisi kadar olmayacaktır muhtemelen ama milyon datalar işin içine girince işler değişebilir. Bu tip durumlarda da bu kadar büyük bir loopa gerek varmı sorusu doğar. Batch bir işlem yapılmayacak ise gerek bile duyulmayacaktır. Örneğin 40 tane propertysi olan...

Try Catch ile Hata Yönetimi (Custom Exception)

Hata yönetimi, "Try-Catch-Finally" bloğu ile yapılır. "Try" kısmında yapılmak istenen işlem yapılır. "Catch" kısmı hataya düştüğü kısımdır burda hatanın yönetilmesi gerekir. "Finally" kısmı ise hatalı yada hatasız her durumda yapılması gereken bir işi yapar. Dışardan alınan servislerde, dönüşüm işlemleri yapılan yerlerde ve nullable data gelebilen durumlarda çoğunlukla kullanılır.  Catch bloğunda exception kontrolü yapılmaz ise pahalı bir işlem değildir. Birden fazla catch kullanılabilir ama "exception" parametresi alan en sonda olmalıdır. Finally kullanılması zorunlu değildir ama dispose/close gibi işlemler burda yapılmalıdır. Mevcut exception türleri ihtiyaçları karşılar ama projedeki sınıflara özel exceptionlar yazılabilir. Bu exceptionlara düşürmek içinde bir metod mutlaka yazılmalıdır.

Koşullar (if-else, swtich-case)

Koşullar, farklı kararlar için farklı işlem yapılmasını sağlar. "If-Else" ve "Switch-Case" olarak 2 koşul türü vardır. Koşulların kullanılmasında bir sıkıntı yoktur ama bir class içinde 10dan fazla kontrol yapılıyor ise o classta bir sıkıntı vardır. Tasarım desenlerinden, yapmak istediğimiz işe uygun olan patterni kullanıp koşul sayısını minimuma indirmeliyiz. Diğer bir riskte, koşulların kod bloklarının birbirine benzer olduğu durumlarda tekrar eden kod bloğu sayısının artmasıdır. Bu durumda da OOP devreye girip ortak metodlar kullanmamızı önerir.

Metodlar (Static, void, Ref, Out, Params, Tuple)

Metod, bir işi yapan kodların bi arada bulunduğu bloktur. Kod tekrarını azaltmak için önemlidir, kullanılması gerekir. Birden fazla işide yapabilir ama SOLID prensiplerine göre bir metod tek iş yapmalıdır. Metod tanımlanırken "Erişim(Access Modifier) + Dönüş Tipi(Return Type) + Adı(Name)" yapısı kullanılır. Her metod dönüş yapmak yani bir değer vermek zorunda değildir.  Void dönüş tipi olan metodlar değer dönmez, istenen datasının değerlerini değiştirir. Erişim belirteçleri genelde "Public" yada "Private" seçilir. Default değer "Private"dır. Public erişimi, heryerden erişim sağlar. Private erişimi, sadece kendi sınıfı içinden erişim sağlar.

Matematiksel İşlemler (Math Class)

Matematiksel işlemler için "Math" sınıfı kullanılır. Math sınıfı statik bir sınıftır, statik olduğu içinde instance almadan(new'lemeden) kullanabiliriz. Math.Abs() : Mutlak değerini hesaplar. Math.Ceiling() : Yukarı yuvarlama yapar. Math.Floor() : Aşağı yuvarlama yapar. Math.Round() : En yakın tamsayıya yuvarlar.  Math.Max(a, b) : En büyüğünü verir. Math.Min(a, b) : En küçüğünü verir. Math.Pow(a, b) : a üzeri b hesaplar. Math.Sqrt(): Karekökünü hesaplar. Math.Truncate() : Virgülsüz kısmı verir.

Operatörler (Aritmetik, Karşılaştırma, Mantıksal)

Aritmetik Operatörler : Karşılaştırma Operatörleri : Mantıksal Operatörler :

Bool, Enum, Nullable, Struct, Var, Object, Dynamic, Random, Tuple Türleri

Bool : CTS'deki (Common Type System) " System.Boolean" tipidir. Değer tipidir, ram üzerinde Stack bölgesinde tutulur. 2 byte yer kaplar. True, False ve Null değerlerini alabilir. Enum : Hardcode metin/sayı yazılmasını engellemek ve statik tanımlamalar yapmak için uygundur. Struct : Çeşitli verileri birarada saklamak ve temel seviyede kullanmak için uygundur. Class kadar yetenekli değildir ama performans dostudur. Değer tipidir, Stack üzerinde tutulur. Var,  Object,  Dynamic : Atanacak değerlere göre, runtime zamanı atama yapılır. Var, atanan tür değiştirilemez ve genellikle hızlı kodlama yapmak için tercih edilir. Object, atanan tür değiştirilebilir ve reflection işlemi gerektiren durumlarda kullanılabilir. Dynamic,  atanan tür değiştirilebilir. Random : Rastgele sayı üreten bir classtır. Nullable : Hiçbir değer atamamaktır. Default değerden farklı olarak, yok hükmünde bir değerdir. Tuple : Class oluşturmadan, birden fazla propertyi tutabilen bir yapıdır.

DateTime ve TimeSpan (Formatlama, Tarih İşlemleri)

CTS'deki (Common Type System) " System.DateTime " tipidir. Değer tipidir, ram üzerinde Stack bölgesinde tutulur. 8 byte yer kaplar. Newlendiği durumlarda Heap üzerinde de yer kaplar.Tarih ve saat değerlerini saklar.

Tip Dönüşümleri (Type Conversation, Implicit, Explicit, Parse, Convert)

Tipler, değer aralıkları izin verdiğince birbirlerine dönüştürülebilir.  Bilinçsiz (Implicit) : Küçük değer tutan tipler, büyük değerlere dönüşürken otomatik dönüşür  char > int > long > float > double Bilinçli (Explicit) : Büyük değer tutan tipler, küçük değerlere dönüşürken otomatik yapılmaz. double > float > long > int > char Parse : Parse metodu ile dönüştürme yapılır. Convert : Convert sınıfı ile dönüştürme yapılır