Kategori arşivi: C#

Performans için Struct ve Class Kavramları

Performanslı Web Uygulamaları geliştirirken dikkat edilmesi gereken bir çok nokta bulunmaktadır. Biz Struct ve Class kavramlarını inceleyeceğiz.

Struct ve Class Traffic
Hanny Naibaho‘nun “The Tunnel” isimli fotoğrafı Unsplash’ten alınmıştır.

Struct ve Class’lar birbirlerine benzer özellikler içermektedir. En önemli farklılıkları Memory üzerindeki davranışlarıdır. Struct bir Value Type, Class ise Reference Type’tır. Bu çok önemli bir detay.

Reference Type ve Value Type ile ilgili yazıma bu linkten ulaşabilirsiniz.

Struct ve Class arasında Constructor farklılıkları da bulunmaktadır. Struct için Default Constructor oluşturulduğunda Derleyici Hatası alınır. Fakat parametrik bir Constructor tanımlaması yapılabilir. Class için Default Constructor engellemesi yoktur.

Class’lar kalıtım yolu ile başka bir sınıftan türetilebilirler. Struct’ta ise böyle birşey yapılamaz. Fakat Struct yapınıza Polymorphism uygulayabilirsiniz. Bu konularla ilgili paylaşacağım bazı forum tartışmaları bulunmaktadır.

https://stackoverflow.com/questions/2310103/why-c-sharp-structs-cannot-be-inherited

https://stackoverflow.com/questions/1222935/why-dont-structs-support-inheritance


New anahtar sözcüğü kullanılarak oluşturulan bir Struct nasıl bir çalışma sergiler örnekle inceleyelim.

Bu şekilde StructSample’ın instance’ı alındığında içerisinde bulunan property’lerin default değerleri atanmış olacaktır. Eğer New anahtar sözcüğü kullanılmasaydı, “Use of possibly unassigned field” hatası alacaktık.

Class’larda olduğu gibi instance alma zorunluluğu yok ama Struct’larda property’leri kullanabilmek için default değerleri tanımlanması gerekiyor.

Struct ve Class Ne Zaman Kullanılmalıdır?

Büyük boyutlara sahip datalarınız için Class kullanmanız daha mantıklıdır. Bunun nedeni Memory yönetimidir. Büyük boyutlu dataların Struct ile Stack’te tutulması performans kaybına yol açacaktır. Aynı şekilde Küçük boyutlara sahip datalarınız için Class kullanırsanız gereksiz yere Heap’i şişirmiş olursunuz. Bu performans açısından büyük bir etkendir.

Çok beğendiğim bir yazıyı paylaşıyorum incelemenizde fayda var.

http://clarkkromenaker.com/post/csharp-structs/

Sonuç

Bu basit görünen seçim bazen size çok fazla hafızaya mâl olabilir, bu yüzden akıllıca seçin!

Object reference not set to an instance of an object

Uygulama geliştirirken en çok karşılaşılan hatalardan birisi hakkında kaçınılması gereken bazı davranışlardan bahsedeceğim.

Hata aslında çözümü kendi içerisinde bahsediyor. Bunu görebilmek/anlayabilmek çok zor ve mutlaka tecrübe gerektiriyor. Basit bir dil ile bu hatanın açıklaması Null olan Referans tipinde bir nesne kullanmaya çalışıyorsun

Reference Type ve Value Type

C#, Value Type ve Reference Type olmak üzere iki tür veri tipine sahiptir. Value Type, veriyi taşıyan ve bellek üzerinde taşıdığı veri kadar alan kaplayan bir tiptir. Reference Type ise bellekte sadece verinin tutulduğu adres bilgisini tutar.

Reference Type

  • String
  • Object
  • Class
  • Interface
  • Pointer

Value Type

  • Int
  • Float
  • Double
  • Decimal
  • Char
  • Bool
  • Enum
  • Struct

Liste alt kırılımlara daha da detaylandırılabilir fakat “Object reference not set to an instance of an object” hatasının sebebini kavramak için bu kadar yeterli.

Örnek vermek gerekirse, ilk değer atamasız Integer ve ya Double bir tanımlama yaptığınızda. Belleğin Stack bölümünde bir alan açılıyor ve değeri buraya hemen taşınıyor. Type’ları incelerseniz eğer Integer örneğin “0” olarak atanır. Bu nedenle ilk ataması yapılmayan bir Value Type sizi çok sıkıntıya sokmaz.

Reference Type, ilk ataması yapılmaz ise bellek için bir şey ifade etmez. “Not Reference(Referans Yok)” statüsündedir. Bu nedenle yeni bir instance alınmadan bu tipi kullanmak istediğinizde “Object reference not set to an instance of an object” hatasını alırsınız.