C#’a Kısa Bir Giriş
C#’ta Inheritance(Miras) Kavramı
| Bu yazıda inheritance’ın programlamada ne anlama geldiğinden bahsedeceğim. Inheritance aslında Oject Oriented Programming!in (Nesne Yönelimli Programlama) üç prensibinden bir tanesidir. Diğer iki prensip ise encapsulation ve polymorphism’dir. Tabii ki diğer iki prensibe bu yazıda değinmeyeceğim. En sade şekliyle: inheritance sayesinde bir sınıfın metodlarını kullanan başka sınıflar türetilebilmesine yarar diyebiliriz. Ancak ayrıntılarına birazdan ineceğim. Eğer daha önce nesne tabanlı bir programlama dili kullandıysanız, (Java ve C++ gibi) C#’ta inheritance’a çok çabuk adapte olursunuz. Aslında şu ana kadar bahsettiklerim genel kültürden ibaretti ve eminim çoğunuz da bunları biliyordunuz. (Nesne Tabanlı Programlama geçmişi olmayanları da düşünerek böyle bir giriş yaptım.)
Evet şimdi ana kısma yani programın nasıl yazılacağına geliyoruz. Bunun için basit bir örnek vereceğim. Düşünün ki student adında bir sınıfımız(class) olsun. Ayrıca bir de teacher adında bir sınıfıımız olsun. Bunların ortak özellikleri nedir? Tabii ki insan olmaları diyeceksiniz ve ana sınıfımıza yani person sınıfına ulaşmış olacaksınız. Şimdi basitçe özetlersek person sınıf’ından teacher ve student adında iki sınıf türetmiş olduk. Sırada bunun kodunu nasıl yazacağımız var. Alışkanlıklara devam edip adım adım kodu yazalım. (Bunu program yazarken de ilke edinirseniz faydalı olacağına inanıyorum. Önce ne yapacağınızı adım adım belirleyin sonra belirlediklerinizi adım adım uygulamaya geçirin.) I. İlk önce person sınıfını yazalım.
II. Şimdi de Student sınıfını yazalım.
III. Sıra Teacher sınıfını yazmaya geldi.
Şimdi dikkat edilmesi gereken noktaları sıralayalım: I. Abstaract (soyut) sınıftan yeni bir sınıf türetilemez. Örneğimizde person sınıfı abstract sınıftır ve new anahtar sözcüğü kullanılarak yeni nesne oluşturulmaz. II. Abstract metodların mutlaka içleri boş olarak yaratılır ve türetildikleri sınıflarda (en az bir sınıf türetilmek zorunda) mutlaka içleri override anahtar sözcüğü kullanılarak doldurulur. III. Bir sınıftan miras yolu ile başka bir sınıf türetileceği zaman temel sınıf(base class) illa ki abstract anahtar sözcüğü ile tanımlanmak zorunda değildir. (Eğer abstract metod içermiyorsa.) Not: Yukarıda kodlarını yazdığım sınıfların basit bir kullanımını içeren Miras adındaki projeyi indirmek için buraya tıklayabilirsiniz. Bu sayede kafalarda hiçbir soru işareti kalmasın istiyorum. Projeyi çalıştırdığınız zaman bir windows form’u gelecek. Bu formun üzerinde iki tane buton var. Student Action butonunu tıklarsanız Student sınıfının içindeki makeAction metodu çalışır. Daha sonra da windows formu yaratıldıktan hemen sonra yaratılan student nesnesinin Name, Age, Gender değişkenleri bir mesaj kutusu aracılığıyla görüntülenir. Teacher Action butonunu tıklarsanız Teacher sınıfının içindeki makeAction metodu çalışır. Daha sonra da windows formu yaratıldıktan hemen sonra yaratılan teacher nesnesinin Unvan, Name, Age, Gender değişkenleri bir mesaj kutusu aracılığıyla görüntülenir. Kafanıza takılan sorular için mail adresim aytacozay@msakademik.net |
C#’a Kısa Bir Giriş
Ben C’ dilini öğrenmeye 1 yıl önce Üniversite’de MS DOS ortamında yaptığımız basit matematiksel işlemlerle başladım.Gerçektende her programda alışıla gelmemiş bir çok komut vardı. Günümüzde kullanılan C# diline göre çok gelişmemiş olan bu dile o kadar ısınmıştık ki artık uygulamalara yetişemez olduk. C çok eskiden çıkan bir dil fakat gelişimi ve insanların ona yetişmesi çok hızlı idi. Sırasıyla C,C++,C# ben buna 3D diyorum yani 3 dev demekle yetiniyorum. C dili bir çok dilin temeli veya üstünde bir dil. Hemen hemen her alanda kullanılmaktadır. Mesela Javascript,ActionScript… En önemli olan uygulama alanı ise Windows ve Linux gibi güçlü bir işletim sistemlerinin C de yazılmasıdır. C dilinin uygulama alanları sadece saydıklarımla sınırlı değildir ama bu alanların hepsini burda listelemem mümkün değildir.
.NET Framework, programcılara aşina olduğu kod dilini kullanma özgürlüğü tanıyarak bir devrim gerçekleştirdi. Ve, belli belirtimlere sadık kalındığı sürece, farklı dillerle yazılmış uygulamaların birbiriyle etkileşebileceğinin de teminatını verdi.
Evet, .NET diller arası etkileşime olanak tanıyan, bir çok dile destek veren bir platform. Üçüncü parti derleyiciler yazılarak .NET için her an yeni bir dil daha yazılabilir. Ama herşeyden önce, .NET’in beraberinde sunduğu dillere bakmak gerekiyor. Bu diller temel olarak 4 tane: C++, Visual Basic .NET, C# ve J#.NET. Dikkat edilirse bu listede, “ben yeniyim” diye göz kırpan bir tanesi var : C#. Yazımızda, bu yeni dili tanımaya çalışacağız.
C# (si şarp) herkesin dile getirmiş olduğu gibi C++ ve Java ‘nın birleşmesiyle oluşmuştur. Henüz nasıl bir birleşme şekli olduğuna dair tam bir fikrim yok ama C# mükemmel bir kütüphaneye sahip. Bu kütüphaneye ufak bir göz aşinalığımız olacak ama ilerideki yazılarımızda diğer dillerden büyük bir farkı olan esnek bir yapıya sahip olmasını inceleyeceğim. Nedir bu esneklik? Yani Program yazarken “of be bu dilin de bu özelliği yokmuş” dediğimiz anlar olmuştur. C ile de şüphesiz nesnel programlama yapabiliriz. Fakat bunu yapabilmek oldukça zordur. C++ ise Nesne yönelimli programlamaya imkan vermekten öte zaten bu paradigmaya göre tasarlanmıştır ve yapısındaki araçlar sayesinde bunu kolaylaştırmıştır. İşte C- C++ arasındaki fark bu peki C#’ın özelliği nedir?
Nesne yönelimli programlamanın günümüzde ne kadar yaygın olduğunu programlama ile ilgilenen herkes bilmektedir. Nesne Yönelimli Programlama (NYP) yaklaşımında temel olan prensiplerden birisi bilgi gizleme (information hiding)’dir. Bu prensibi projelerimizde uygulamak için C#’in sunduğu en önemli araçlardan biri olan sınıf özellikleri (class properties) konusunu inceleyeceğiz.
Bildiğiniz gibi, C# dilinde tasarlanmış bir sınıfta iki temel unsur bulunur. Birincisi sınıfın özellikleri (fields), ikinicisi ise sınıfın metodlari (methods)’dır. Herhangi bir sınıfın özellikeri sınıfta tutulan ilişikili verilerlerdir. Diğer taraftan sınıfın bizim için değişik işleri yapmasını metodları vasıtasıyla sağlarız. Sınıf tasarımı çok önemli bir iş olup; deneyim, konsantrasyon ve dikkat ister. Sınıfımızın özelliklerini tutan veriler, program akışı sırasında sınıf dışında değiştirilebilir veya bu değerlere ulaşmak istenilebilir.
Elbetteki C# hakkında bilinmesi gerekenler bu kadarla sınırlı değildir. Bundan sonraki yazılarımda herşeyi daha ayrıntılarıyla aktarmaya çalışacağım.
.NET İçin Tavsiye Edilen İsimlendirme Konvansiyonları – 1
Merhaba, bu makalemizde artık programcılık hayatımızın heryerinde, küçüklü büyüklü her program için ihtiyaçtan çok bir zorunluluk haline gelen isimlendirme tekniklerine, tarihçelerine değinecek,kendi isimlendirme stilimizi nasıl oluşturabiliriz ona bakacağız. 1. bölümün tamamını ,yani bu yazıyı tümüyle bu alacakken , 2. bölümününde özellikle Microsoft’un .Net için de tavsiye ettiği konvansiyon olan Pascal & Capitalized Form (Pascal ve Büyük harfler notasyonu) ve uygulaması üzerinde duracağız.
Neden İsimlendirme Konvansiyonlarını Bilmeliyiz?
Tabii ki bu konvansyonları kullanmak zorunda değiliz,kendi konvansiyonumuzu oluşturup kodlamaya da geçebileceğimiz gibi,konvansiyonsuz da kodlama yapabiliriz. Fakat ileri düzey programlamada isimlendirmenin birçok avantajı vardır.
İsimlendirme kavramı,programlama dünyasında komplex kodların yazılmaya başlanmasıyla,özellikle de OOPL (Nesne Yönelimli Programlama Dilleri) nin gelişmesiyle büyük önem kazandı. Çünkü ortak olmayan ve anlamsız isimler,modullere bölünmüş ve çözüm uzaylarına ayrılmış,spesifikasyonları hazırlanmış,yani en önemli bölümü halledilmiş bir programın sadece kodlama aşamasında çeşitli ciddi hatalara yol açılmasına sebep oluyordu. Bir kişiden fazlasının çalışmasını gerektiren projelerde insanlar birbirlerinin yazdıkları kodu anlamıyor, hatta bir kişinin kendi yazdığı programı bile daha sonra baktığında anlaması güçleşiyordu.
İsimlendirme konvansiyonlarını kullanmanın diğer bazı avantajları ise şunlardır :
o Programa vereceğimiz isimler anlamlı olur.
o Hepsi bir kurala bağlı olduğu için düzenli görünür.
o İsim seçme işlemi artık mekanik olduğundan üzerinde düşünmeye gerek kalmaz, hızlı çalışırsınız.
o Takım çalışmalarında aynı dili konuşmanızı sağlar.
o Kodlarınız anlaşılır olacağından daha az yorum yazabilirsiniz.
o Kodunuzu böceklerden(bugs) arındırırken faydası olur.
o Kod standardize olduğu için daha sonra programınızın kodunu başka bir program yardımıyla iyileştirebilirsiniz.
o Ortam hazırlayıcıları tarafından belirlenen notasyonu kullanmak,ortam tarafından otomatik olarak koda yerleştirlien kod parçaları ile de uyumlu olacağı için ( ör: Form Designer’ın koda eklentileri ) tam uyum sağlar.
İsimlendirme konvansiyon Çeşitleri
Bu sorunlara bir çözüm bulmak için notasyon adı verilen standartlar geliştirildi. Ortamların farklılığından dolayı birçok standard ortaya çıktı. Bunlardan bazıları şunlardır :
Hungarian notation (Macar notasyonu):
Macar notasyonu diye bilinen bu notasyon diğer notasyonların atası olarak kabul edilmesi itibariyle,günümüzde geçerliliği azalmıştır.
DOS’un ilk çıktığı zamanlarda Microsoft’un şef direktörü Charles SIMONYI tarafından geliştirilen bu tanımlayıcı isimlendirme notasyonunun temelinde,ismin önüne tipini yazarak aktif isimlendirmeyi sağlamaktır. Örnek verecek olursak, bir boolean flag için “bFlag” isimlendirmesi uygun bir isimlendirme şeklidir. String olarak strFirstName,integer olarak iNumberOfDays uygun isimlendirmelerdir.
Bu isimlendirmenin getirdiği faydalar artık modern programlama ortamlarının geliştirilmesiyle ortadan kalkmıştır. Çünkü,mesela .Net gibi bir ortamda bir değişkenin tipi zaten kodun her yerinde bellidir,bundan dolayı ismi uzatmaya gerek yoktur. Yani,bu notasyonun günümüzde kullanımı artık azalmıştır.
Ayrıca ortamların desteklediği tür sayısı günden güne arttığından bu tür bir isimlendirmeye gitmenin bayağı bir güç olacağı açıktır. Bu türün Extended Hungarian Notation,Modified Hungarian Notation ,Simple Hungarian Notation Hungarian Notation türleri bulunmaktadır.
MFC naming (Member-First Case) (İlk harfi tanımlayıcılı notasyon):
Bu notasyonun temelinde tanımlayıcının tipinden çok türü önemlidir,yani int mi,short mu olmasından çok üye,sınıf,fonksiyon olmasına gore isimlendirilir. Event isimleri ise (On) ile başlar. Örnek olarak m_socket, i_counter,OnClose bu notasyona göre iyi isimlendirilmiş tanımlayıcılardandır.
Bu isimlendirme tekniğinin ise eskidiği Macar notasyonunda belirttiğimiz nedenlerden ötürü açıktır.
GNU Notation (GNU Derleyici Notasyonu)
Üstte belittiğimiz diğer notasyonlardan farklı olarak bu notasyonda kelimeler arasında altçizgi ( _ ) karakteri bulunma şartı getirilmiştir. Örneğin global_number_increase güzel bir isimlendirme iken icantreadthis iyi değildir. Ayrıca bazı GNU derleyicilerinde 8 ve/veya 14 harften fazlasına izin verilmediğinden zorunlu olarak bu derleyicilerin standartlarına harf sınırlaması da getirilmiştir.
Ayrıca yine bazı derleyicilerde ( __ ) ile başlayan değerler ayrılmıştır. Bundan dolayı altçizgi ile başlayan isimlendirmeler iyi isimlendirme örneği değildirler.
Diğer bazı notasyonlar ise Sun – Java notation, SmallTalk – Roll Based Naming, Taligent Form dur.
Kendi İsimlendirme Konvansiyonumuzu Oluşturma
Yazının bu kısmına kadar , varolan isimlendirme çeşitlerini iyice anladığımızı umuyorum. Fakat hala benim kendi isimlendirme standardım olmalı diyorsak, dikkat etmemiz gereken bazı noktalar var.
Bir isimlendirme konvansiyonu oluştururken,dikkat etmemiz gerekenlerden ilki, isimlerin anlaşılabilecek kadar uzun, fakat yazılabilecek kadar kısa olmasıdır. Bunları oluştururken konvansiyonları kullanmanın temel faydalarına zarar vermemeyi gözetmeliyiz.
İsimlendirme konvansiyonumuzu seçerken ortam,dil, ve kültür özelliklerine, isimlendirme konvansiyonu mantığının temelinde yatan estetik kaygıya ve algoritma oluşturmanın temel şartlarına (verimlilik,isteneni verme vs vs …) dikkat etmemiz gerekir.
Tüm İsimlendirme Konvansiyonlarınında Bulunması Gereken Temel Özellikler
Bütün standartlarda ortak olması gereken noktaları ise şöyle sıralayabiliriz :
- Tanımlayıcının(değişkenin,sınıfın,metodun vb…) amacı doğrultusunda isimler verilmesi gerekir. Mesela okuldaki öğrenci sayısını tutan bir değişkene “tamsayi” şeklinde isim vermek yerine “ogrencisayisi” şeklinde isim vermek daha mantıklı olacaktır.
- Tanımlayıcının ismi büyük ve küçük harfleriyle okunabilir ve anlaşılır uzunlukta olmalıdır.
- Mümkün olduğunca kısaltmaları azaltmalıdır. Çünkü kısaltmalar çoğu zaman tehlikeli olabilmektedir. Örneğin “Ctr” “Control” olarak anlaşılabileceği gibi “counter” olarak da anlaşılabilir.
- Tanımlayıcıların isimleri,diğer tanımlayıcılar arasında ayırt edici özellik olarak kullanılmamalıdır. Örneğin “Counter” ve “counter” adında iki değişkenimiz olmamalıdır
Daha sonra iş kendi isimlendirme standardımızın şartlarını oluşturmaya bakıyor. Bunun için bu yazı genel bir fikir verebilir. İsimlendirme tekniklerinizi,hiçbir tanımlayıcı tipi açıkta kalmayacak şekilde tasarladıktan sonra projenin daha sonra da aynı mantıkla geliştirilmesi ve isimlendirme konvansiyonunuzun kalıcılığını koruyabilmesi için iyi bir şekilde dökümante etmelisiniz.
Dökümantasyonunuz isimlendirme konvansiyonunuzla ilgili herşeyi içermelidir(Tip isimleri,ön ekler,arka ekler,kısaltmalar,eklentiler,özel karakterler,vb…) .
Ve son söz olarak , unutmayalım ki , bir çok kod bir kez yazılır ama binlerce kez okunur. Bunu göz önüne alarak kodlamamızı daha profosyonel standartlara taşıyalım.
Yazının 2. bölümü Microsoft’un .NET ortamı için önerdiği formlar olan PASCAL & CAPITALIZED FORM , CAMEL FORM adlı notasyonları derinlemesine inceleyecek , ve herhangi bir isimlendirme sistemimize aykırı davranıldığını çok büyük kod parçalarında nasıl anlayacağımızı anlatacağım.
Görüşmek üzere,
C# ‘ta Kapsülleme, Erişim Belirteçleri ve Polymorphism
Geçen yazımda inheritance’ tan bahsederken encapsulation diye bir kavramdan bahsetmiştik, şimdi bu kavramı açıklayacağım. Daha önceki yazımda belirttiğim gibi 3 OOP prensibinden biri. Türkçe karşılığına gelirsek kapsülleme demek. Ancak bilgisayar terimi olarak biraz açarsak kapsülleme, yönettiği kod ve veriyi birbirine bağlayan ve bu ikisini dış kaynaklı karıştırma ve yanlış kullanımdan koruyan bir mekanızmadır. Bu sayede veriyi dış ortamdan koruyan bir ambalaj vazifesi gördüğünü de söyleyebiliriz. Şimdi kapsüllemeyi biliyoruz da C#’ta yada .Net Framework’ünde ne gibi farklılıklar var diyeceksiniz? Öncelikle .Net Framework’ünde gelen yeniliklerden bahsedelim.
I. Erişim belirteçlerinin(Access Modifiers) varlığı kapsüllemeyi çok daha rahat yapabilmemize olanak sağlar. Bu sayede bir metod veya bir değişken anahtar sözcükler(keywords) aracılığıyla sadece önceden belirlenen sınırlar dahilinde kullanılabilir. Yada bunlara belirlenen sınırlar içinden ulaşılabilir. Burada bahsedilen keyword’leri birazdan açıklayacağım. (Tabii ki C#’ta kullanılan keywordleri açıklayacağım. Ve kullanımlarını basitçe anlatacağım.)
II. Özellik(Property) Sahalarının kullanımı (Bunun yapımını ilerde C# kodu ile göstereceğim.) Bu sayede .Net Framework kapsüllemeyi destekler.
III. Soyut sınıf(abstract class) ve soyut metodların(abstract methods) kullanımı. Aslında kalıtım(inheritance) konusunu anlatırken taban sınıfımız(base class) soyut sınıf idi. Onun için bu kısmı sadece açıklayacağım. Örnek vermeyeceğim. Örneği görmek isteyenler miras(inheritance) konusunu anlattığım yazıdaki örneği incelerlerse istedikleri bilgiye ulaşabilirler.
Evet bu kadarlık giriş yeter. Şimdi yukarıda anlattığım 3 maddeyi enine boyuna tartışalım.
I. Erişim belirteçlerinin ne işe yaradıklarından yukarıda bahsettiğim için burada direkt erişim belirteçlerinin neler olduklarını yazalım ve erişim sınırlarını çizelim. Erişim sınırları geniş olandan dar olana doğru bir sıralama yaparsak.
- public: Bütün her yerden erişilmek istenen veriler public anahtar sözcüğü ile birlikte kullanılır. Sadece aynı proje içerisinden değil diğer projeler içerisinden de erişilebilir.
- internal: Aynı assembly içindeki tüm sınıflar erişebilir. Yani public anahtar sözcüğünün sadece aynı proje içinden erişilebileni. (VB .Net’te ise Friend anahtar sözcüğüne karşılık gelir.)
- protected: Protected anahtar sözcüğü ile birlikte kullanılan verilere ise sadece bir alt sınıfa kadar erişilebilir.
- private: Bu ise sadece tanımlandığı sınıfta geçerli olan veriler için kullanılır.
Ancak kontrollerde(controller) yaygın olan kullanım şekli kontrollerin dışarıdan erişilmesi istenen metodlarının(aynı anda diyelim ki 3 tane kontrol’ün belli metodlarının çalışması gerekli olabilir.) public anahtar sözcüğü kullanılan bir metod içinde tanımlanmasıdır. Şimdi bu durumun nasıl yapıldığını gösteren mini bir örnek kod yazalım. Kodda belirtilen kontrollerin daha önceden tanımlanmış olduğunu düşünelim.
| public void ChangeColor(Color color) { this.groupBoxLine.BackColor = color; this.groupBoxOutCity.BackColor = color; this.groupBoxExternalPriceDetails.BackColor = color; this.groupBoxInternalPriceDetails.BackColor = color; this.groupBoxUser.BackColor = color; this.groupBox1.BackColor = color; this.btnAddNewLine.BackColor = color; this.btnAddNewUser.BackColor = color; this.btnCentralReport.BackColor = color; this.btnChangePassword.BackColor = color; this.btnDeleteExternalLine.BackColor = color; this.btnDeleteInternalLine.BackColor = color; this.btnDeleteUser.BackColor = color; this.btnExit.BackColor = color; } |
Yukarıdaki metod bir renk parametresi gönderilerek çağrıldığı zaman yukarıda yazan bütün (daha öncede private anahtar sözcüğü ile tanımlanmış olduklarını kabul etmiştik.) kontrollerin rengini gönderilen renge değiştirmeye yarıyor. Bu sayede yukarıdaki kontrollerin hepsinin BackColor dışındaki metodları dış dünyadan soyutlanmış oluyor.
Aslında yaptığımız metod public anahtar sözcüğü ile tanımlanmayıp internal anahtar sözcüğü ile de tanımlanabilir. Bu bizim metodun içindeki kontrollere ait BackColor metodlarının dış dünyadan ne kadar soyutlanmasını istediğimiza bağlıdır.
II. Özellik sahaları sınıflara ait özel(private) değişkenlerin aynı metodlar gibi dış dünyaya açılmalarını sağlıyor. Sadece okuma amaçlı dışa açılım yapılabildiği gibi hem okuma-hem yazma amaçlı bir açılım da yapılabilir. Teorik olarak sadece yazma amaçlı da bir açılım olsa da ne kadar mantıklı olur bilmem!!!! Şimdi örneklerimize geçelim.
|
private int currentExNumber = -1; public int CurrentExNumber //Sadece okuma amaçlı özellik public int LoginStatus //Hem okuma hem yazma amaçlı özellik |
Şimdi yukarıdaki özellikleri kullanırken nesneadi.LoginStatus ve nesneadi.CurrentExNumber şeklinde kullanabiliriz. Yalnız dikkat etmemiz gereken CurrentExNumber kullanılacağı zaman sadece eşit işaretinin(=) sol tarafında kullanılabilecek olması. Çünkü başta da belirttiğimiz gibi sadece okuma yapabildiğimiz için get metodu var. Zaten bir değer atamaya kalkarsak hata verecektir.(Derleme esnasında özelliğin sadece okuma amaçlı olduğuna dair debug penceresinden mesaj verir.) Bu sayede de değiştirilmesini istemediğimiz ama kullanmak zorunda olduğumuz verilerin dış ortamdan hem soyutlanmasına hem de bunların dış ortama belirli izinler dahilinde açılımına izin vermiş olduk.
III. Aslında soyut sınıf ve soyut metod’dan daha önce az da olsa miras konusunu anlatırken bahsetmiştim. Ancak şimdi biraz polymorphism’den bahsederek bu kavramları biraz daha açacağım. Polymorphism kapsülleme ve miras’dan ayrı düşünülemez. Polymorphism Yunancada “çok formluluk” anlamına gelmektedir. Polymorphism ile soyut sınıf arasındaki ilşkiden bahsetmeden önce soyut sınıf ve soyut metodlarla ilgili bir iki ayrıntı daha verelim. Soyut sınıf sadece taban sınıflarında kullanılır ve yeni nesne yaratılmasında kesinlikle kullanılamaz. (Yani new anahtar sözcüğü kullanılamaz.)
Soyut metodlara gelince bunların ise soyut sınıflarda kullanılacağından bahsetmiştik. Bunun bize sağladığı avantaj bu metodların türetilen sınıflarda nasıl gerçekleştirildiğini bilmek zorunda olmamamızdır. Aslında bunu söyleyerek polymorphism’in yararından bahsetmiş olduk. Yani polymorphism veri soyutlaması yaparak sadece ilgilenmemiz gereken olaylar ve verilerle ilgilenmemize olanak sağlıyor. Bu sayede taban sınıfından türetilen ve aynı metodu farklı gerçekleştirimlerle(implementation) kullanan birden fazla sınıfa sahip olabiliyoruz. En basit örnek üçgen bir çokgen, kare de bir çokgen ve her ikisinin de bir alanı mevcut. Hemen basitçe bir taslak çıkarırsak çokgen sınıfı soyut taban sınıfı ve alan adında soyut bir metoda sahip. Üçgen ve kare sınıfları ise türetilen sınıflar ve alan metodunu istedikleri biçimde gerçekleştiriyorlar. (Bu işlemlerin nasıl yapıldığı miras konusunu anlattığım yazıda mevcuttur.)
Bir de soyut özellikler(abstract property) var. Bunların kullanımı ise soyut metodlar ile özelliklerin birlikte kullanımı ile ortaya çıkmakta. Buna bir örnek kod verirsem anlaşılması daha kolay olacaktır. Ancak bunların kullanımına çok sık rastlamadığımı belirtmem gerekir.
Sanırım aşağıdaki örnek kod parçası soyut özelliklerin kullanımını daha da netleştirmiştir.
| abstract class Taban // Soyut sınıf { protected int CurrentExNumber = -1; public abstract int GetCurrentExNumber// Soyut özellik class Turet: Taban //Turet adlı bir sınıf türetiliyor public override int GetCurrentExNumber// overriding property |
Polymorphism’den bahsettik. Şimdi ise yalancı polymorphism’den bahsedelim. Aslında bir örnekle biraz daha açarsam daha net olur. Diyelim ki bir karşılaştırma metodunuz var ve hem integer hem de string veri tiplerini karşılaştırmak istiyorsunuz. Yalancı polymorphism sayesinde aynı isimde iki metod yazarak bu isteğinizi gerçekleştirebilirsiniz. Bunun için mini bir örnek kod yazalım isterseniz.
Aşağıda yazacağım metodların aynı sınıf içinde yazıldığını düşünelim. Şimdi bu metodları kullanırken metodların içinde yer aldığı sınıftan üretilen nesneninadi.karsilastir( yazdığımız anda kod tamamlayıcısı bize iki seçenek sunar biri bu metodun iki tane integer veri tipi ile çalıştığı, ikincisi ise bu metodun iki tane string veri tipi ile çalıştığıdır. Bu sayede bir arabirim ile birden fazla metod gerçekleştirilmiş olur.
Aslında bir metodun birden fazla gerçekleştirime sahip olması olayına overloading denir.
Dikkat edilmesi gereken nokta overloading ile overriding’in birbirine karıştırılmamasıdır. Unutmayın overloading’te bütün işlemler aynı sınıf içerisinde oluyor. Overriding’te ise tek bir sınıf yerine taban sınıfı ile bu sınıftan türetilen sınıflar işin içine giriyor.
public void karsilastir(int sayi1, int sayi2)
{
//Metodun iç implementasyonunu sizlere bıraktım.
}
public void karsilastir(string data1, string data2)
{
Metodun iç implementasyonunu sizlere bıraktım.
}
Evet bu yazıda anlatacaklarım sona erdi. Kafanıza takılan kısımlar için mail adresimi tekrarlıyorum
Yeni Nesil İş Uygulamalarının Mimarı C# ve Diğer Diller
Şirket yöneticileri geliştirilecek proje için bir programlama dilini seçmek zorunda kaldığında genelikle şu soruyu sorar : Hangi programlama dili ile projeyi en etkin ve en hızlı şekilde müşterime sunabileceğim hale getirebilirim? Bu sorunun çözümüne ulaşmak o kadar da kolay olmuyor maalesef. Çözüme zor ulaşmada programlama dillerinin fazla olmasının etkisi omakla beraber her bir programlama dilinin sunduğu standart kütüphanenin farklı olmasının da etkisi oldukça fazladır. Özellikle günümüz iş uygulamaları birden fazla platformu destelemek zorunda kalmıştır. Buda seçilecek uygulama geliştirme ortamının önemini açıkca göstermektedir. Uygulamaların internet ortamına taşınması ile birlikte bir programlama dilinden beklenen özelliklerde doğal olarak değişmiştir. 1970’ li yıllarda bir mikroişlemciyi programlamak ne denli önemli olduysa 2000’li yıllarda interneti programlamak o kadar önemli olmuştur.
İnternet’in iş dünyasına girişi ile birlikte geliştirilen uygulamalardan beklenenler de değişmiştir. Bu durum doğal olarak uygulama geliştiricileri doğrudan etkilemiştir. İnternet ortamında çalışan ve dağıtık yapıda çalışabilen çok yönlü bir uygulama geliştirmek eski yöntemlerle imkansız değildir ancak inanılmaz derecede zaman ve insan gücü gerektirmektedir. Bu zorulukları aşmak için gelişen teknolojiye ve isteklere paralel olarak programlama dilleri de doğal gelişim içine girmiştir. Bu yazıda son yıllarda iş ve kişisel uygulama geliştiricilerin adını sıkça duyduğu C# programlama dili ve diğer dillerle olan ilişkisi anlatılacaktır. C# programlama dilinin sunduğu imkanları anlatmaya başlamadan önce programlama dillerinin tarihsel gelişimine göz atmak gerekir. Zira C# dili yıllardır yoğun bir şekilde kullanılan C,C++ ve JAVA dillerinin temelleri üzerine kurulmuştur. Şunu da hemen belirtelim ki, son geliştirilen ilk geliştirilenden çoğu zaman daha iyi olacaktır. Bu yüzden eski ile yeniyi karşılaştırırken ticari amaçları bir kenara bırakıp objektif bir gözle değerlendirmek gerekir.
C#’ı konuşmadan önce C, C++ ve C# ile yakından ilişkili olan JAVA’dan bahsetmek gerekir.
C dili ve Yapısal Programlama
Düşündüklerimizi makinelere yaptırma isteğimizin bir sonucu olarak programlama dilleri doğmuştur. Makineleri anlamak insanoğlu için o kadar da kolay olmamıştır. Zira makinelerin(bilgisayarların) anladığı dilden konuşmak insanlar için gerçekten zor bir iştir. Gün geçtikçe makineleri anlamak ve onları programlamak için yeni arayışlar içine girildi. Somutlaştırılmış makine komutları sayesinde bilgisayarları daha etkili bir şekilde yönetmek mümkün hale gelmiştir. Zaman ilerledikçe bilgisayarlar sadece belirli bilimsel hesaplamaları yapmak için kullanılan araç olmaktan çıkıp insanların yaşamlarında rutin işleri yapabilecek araç haline geldi. Bilgisayarların insanların ihtiyaçlarına hızlı bir şekilde cevap verebilmesi için onları hızlı bir şekilde programlamak gerekiyordu. Klasik yöntemlerle(makine komutlarıyla) hızlı çözümler üretilemez hale gelince daha yüksek seviyeli programlama dillerine ihtiyaç duyuldu. 1980’li yıllarda en çok kullanılan programlama dili olan “C” bu anlamda atılmış büyük bir adımdır. Yapısal programlama modeli her ne kadar C dilinden önce de yapılıyor idiyse de asıl büyük gelişmeler C dili ile birlikte olmuştur. C gibi makine diline göre yüksek seviyeli programlama dilleri ile büyük projeler yapılabiliyordu. Artık uygulamalar sadece bilimsel çalışma aracı olmaktan çıkıp iş dünyasında kullanılabilen uygulamalar haline geldi. Bütün bu iyi gelişmelerin yanında zaman su gibi akıp gidiyordu, buna paralel olarak projeler büyüyor ve teknoloji artan ivmeyle gelişiyordu. Yavaş yavaş anlaşıldı ki C dili çok büyük projelerde yetersiz kalıyordu. Yeni bir programlama modeline ihtiyaç duyuldu ve C++ dilinin temelleri atıldı.
C++ ve Nesne Yönelimli Programlama
Yapısal programlama modeliyle çok büyük projeleri kontrol altına almak neredeyse imkansızdır. Bu sorunun üstesinden gelmek için yeni bir model gerekiyordu. Nihayet Bjarne Stroustrup tarafından C dili baz alınarak yeni bir programlama dili geliştirildi. Bu dilin adı : C++’tır. C++, C’nin üzerine inşaa edildiği için ilk başlarda “C with Classes”(Sınıflı C) olarak adlandırıldı. Peki bu dil C’den farklı olarak programcılara ne sunuyordu? C++ dilinin sunduğu en büyük yenilik nesne yönelimli programlamayı destekliyor olmasıdır. Nesne yönelimli programlama tekniği günümüzde de yaygın bir şekilde kullanılan bir tekniktir. Bu teknik gerçek hayatı modellemede büyük bir başarı sağlamaktadır. Söz gelimi bir projeyi parçalara ayrıp bu parçalar arasında programlama yolu ile bağlantılar kurmak çok basit hale gelmiştir. Nesne yönelimli programlama tekniği proje geliştirme aşamasında burada sayamayacağımız birçok kolaylık sağlamaktadır.
C++ dilinin diğer bir özelliğide C programcılarına hitap etmesiydi. C dilindeki temel kurallar aynen C++ dilinde de mevcuttur. Bu yüzden C++ dilini ve nesne yönelimli programlama tekniğine geçiş yapmak için C dilini iyi bilmek gerekir. Daha doğrusu C++ dilini sadece nesne yönelimli programlamayı destekliyor şeklinde düşünmemek gerekir. Günümüzde birçok alt seviye işlemlerde(haberleşme, işletim sistemi, aygıt sürücüleri) C++ dilinin yoğun bir şekilde kullanılması bunun bir kanıtıdır.
İnternetin Gelişimi ve JAVA Dili
İnterneti’in gelişimi bilgisayar dünyasındaki en önemli ilerlemelerden biridir. Programlama dünyasında JAVA dilinin ortaya çıkması en az internetin ilerlemesi kadar önemlidir. Çünkü C ve C++ dilleri ile yalnızca belirli sistemlere yönelik uygulamalar geliştirilebiliyordu. Oysa internet sayesinde birçok farklı sistem birbirine bağlanır hale gelmiştir. Artık sistemlerden bağımsız uygulama geliştirmek gerekiyordu. Daha doğrusu interneti hedef alacak uygulama geliştirmek gerekiyordu. Programcılar gelişen internet ortamına yabancı kalamazdı. Bu amaç doğrultusunda Sun Microsystems isimli firma önceleri OAK olarak anılan JAVA isimli programlama dilini ortaya çıkardı. JAVA, dil olarak C++ dilinin devamı gibi düşünülebilir. Ama amaç tamamen farklıdır. Zira Sun firması ortaya JAVA dili ile birlikte yeni bir uygulama geliştirme modelide sunmaktaydı. Bu programlama modelinde en büyük hedef sistemler arası taşınabilir kod yazmaktır. Yani bir uygulamayı hem Microsoft platformunda hemde Unix ve Linux platformlarında çalıştırabilmek hedeflenmiştir. Böylece geliştirilen uygulamalar işletim sistemi ve işlemciden bağımsız hale gelecektir.
Peki sistemler arası bu yüksek taşınabilirlik nasıl olmaktadır? Cevabı basit : Ara Dil. Evet, JAVA dilinde yazılmış kodlar derlendiğinde kodlar makine komutların çevrilmeden “ara kod” denilen “bytecode” a çevrilmektedir. Bytecode’a çevrilen program çalıştırıldığında Java Sanal Makinesi devreye girer ve uygulamanın çalıştırıldığı sisteme özgün makine kodunu üretir. Bu durumda Sun firmasının bir çok sistemde çalışabilecek Java Sanal Makinesi üretmesi gerekiyordu. Nitekim zamanla günümüzde yaygın kullanılan bütün sistemlerde sorunsuz çalışabilecek Java Sanal Makineleri geliştirildi. Hatta şu an için bazı cep telefonları ve çeşitli sim kartlarında bile JAVA programlarını çalıştırabilecek Java Sanal Makineleri mevcuttur.
JAVA ile C++ dili her ne kadar birbirine çok benzer olsada aynı kategoride değildir. Elmayla armutu karıştırmamak gerekir. Eğer “JAVA mı C++ mı” diye bir soru sorulursa cevap “her ikisi de” olacaktır. Çünkü ikisininde kullanım amacı farklıdır. Bir firma bir proje için hiçbir zaman bu iki dilden birisini seçmek durumunda kalmayacaktır. JAVA ile aynı kefeye koyabileceğimiz dil birazdan anlatacağım C# dilidir.
C# Dili ve .NET Platformu
JAVA’nın platform bağımsız kod üretmedeki başarısı su götürmez bir gerçektir. Bir çok kurumsal dev projede JAVA dilinin ve J2EE platformunun olanaklarından faydalanılması bunun en önemli göstergesidir. Günümüzde büyük projelerde birden fazla programlama dili kullanılabilmektedir. Ancak JAVA’nın diller arası uyumlu çalışmaya destek verememesi JAVA’nın bir eksikliği olarak görülmüştür. Diller arası uyumlu çalışma alanında en büyük başarıyı Microsoft firması sağlamıştır. Son dönemlerde sıklıkla kullanılan COM teknolojisi bu uyumluluğa bir örnektir. COM sayesinde farklı dillerde yazılan yazılım parçacıkları diğer bir uygulamada kullanılabilmektedir.
JAVA’nın programlamadaki büyük bir boşluğu doldurması onun en büyük rakibi olan Microsoft firmasının gözünden kaçmadı. En sonunda Microsoft’un bir ürünü olan Visual Studio yazılım geliştirme aracına JAVA yı da ekleme kararı aldı. Visual J++ adı altında Windows platformuna entegre edilen JAVA dili bu platformda pek başarılı olamadı. Bu oluşumun başarılı olmadığını gören Microsoft yeni arayışlar içine girdi. Microsoft başkasının malını kendi ürününe entegre etmek yerine kendi ürününü geliştirmeye karar verdi ve .NET yazılım geliştirme platformunu ortaya çıkardı. .NET temel felsefe olarak J2EE platformuna benzemektedir ancak .NET’in derinliklerine daldıkça çok yeni kavramlarla karşılaşırız. Bu yeniliklerden en önemlisi “diller arası uyumluluk” tur. J2EE platformunda sadece JAVA dili kullanılıyorken .NET platformunda birçok dil kulanılabilmektedir. Bu dillerin sayısı oldukça fazladır. Üstelik Microsoft tarafından .NET platformu için sıfırdan yeni bir dil tasarlanmıştır. Yapı olarak C++ ve JAVA dilllerine benzerliği ile bilinen bu dil Anders Hejlsberg tarafından geliştirilen C# (C Sharp)’tan başka bir şey değildir..
JAVA, C++ diline nasıl benziyorsa C# dilide C++ ve JAVA’ya benzemektedir. Programlama modeli yine her üç ortamda da nesne yönelimlidir. Değişen şey bu modelin uygulanış şeklidir. C++’ta kaynak kod derleyici tarafından makine koduna, JAVA’da bytecode’a C#’ta ise IL(Intermediate Language-Ara Dil)’a çevrilmektedir. Burda vurgulanması gereken en önemli nokta JAVA’da bytecode JAVA sanal makinesi tarafından yorumlanarak çalıştırılırken, .NET’te IL kodları derlenerek çalıştırılmaktadır. Hemen şunu da belirtelim ki, derleme işlemi yorumlama işleminden performans açısından daha öndedir.
C# dil olarak C++ ve JAVA’ya çok benzemektedir. Bu yüzden C# dilini konuşurken .NET platformunu göz önünde bulundurmalıyız. Dilleri sadece birer araç olarak görmemizde fayda var. İsterseniz lafı daha fazla uzatmadan JAVA/J2EE ve C#/.NET’i karşılaştırıp benzerliklerini ve farklılıklarını ortaya koyalım ardından C#’ı diğer .NET dillerinden ayıran özellikleri inceleyip “neden C#” sorusuna cevap arayalım.
C# ile .NET mi JAVA ile J2EE mi?
Saf C# ve JAVA dilleri düşünüldüğünde birkaç nokta dışında bu iki dil birbirine benzemektedir. Bu yüzden karşılaştırma yaparken bu dillerin kullanıldıkları platformlarıda göz önünde bulundurmak gerekir. İsterseniz madde madde her bir özelliği iki platform için değerlendirelim.
1-) Mimari : .NET ve J2EE çalışma biçimi olarak birbirine çok benzer. Her iki platformda da uygulama kaynak kodu ara bir koda dönüştürülür. Aradaki en büyük fark bu ara kodun işletilmesi sırasında görülür. .NET’te ara kod çalışma zamanında derlendikten sonra çalıştırılırken JAVA’da yorumlanarak çalıştırılır.
2-) Çalışma Zamanı(Runtime) Mimarisi : J2EE platformundaki Java Sanal Makinesi ile .NET platformundaki CLR(Common Language Runtime) birimi eşdeğerdedir. JVM, bytecode’un işletilmesinden sorumlu iken CLR, IL kodlarının işletilmesinden sorumludur.
3-) Sistemler Arası Taşınabilirlik : Teorik olarak C# ve JAVA ile yazılmış uygulamalar sistemden bağımsızdırlar. Günümüzde C# ile .NET ortamında geliştirilen uygulamaların bir çok mobil cihazda ve Windows sistemlerinde kullanıldığını düşünürsek bu teorinin yavaş yavaş gerçeğe dönüştüğü görülebilir. Yakın bir gelecekte .NET altyapısının Linux versiyonunun da çıkacağı bilinmektedir. JAVA ise bu konuda kendisini çoktan kanıtlamış durumdadır.
4-) Diller Arası Uyumluluk : J2EE platformunda sadece JAVA dili kullanılırken .NET ortamında C#,C++,VB.NET ve hatta JAVA dili bile kullanılabilmektedir. Üstelik farklı dillerde yazılmış parçacıklar diğer bir dilde sorunsuzca kullanılabilmektedir. Bu sayede bütün programcıların .NET platformunda rahat programlama yapabilmesi sağlanmıştır. .NET uyumlu herhangi bir dilde geliştirilen bütün uygulamalar aynı ara koda dönüştürüldüğü için .NET dilleri arasında büyük performans farklılıkları meydana gelmez.
5-) Web Servisi Kullanımı : Web Servisleri dağıtık yapıda geliştirilen uygulamaların temel parçası olmuştur. Özellikle iletişimin XML tabanlı olması web servislerinin önemini göstermektedir. Her iki dil ile web servislerine erişmek mümkün olsada C# ile bir web servisini kullanmak oldukça kolaydır. C# ve .NET’in web servislerine kolay erişmesi bir avantaj olarak görülebilir.
6-) Bellek Yönetimi : C#’ta aynen JAVA’da olduğu gibi kullanılan nesneleri toplama programcının görevi değildir. Kullanılmayan gereksiz nesneler gereksiz nesne toplayıcısı tarafından zamanı geldiğinde bellekten silinirler. Buna rağmen C# programcıları isterse belleği kendileri de yönetebilir. Yani C# dilinde bellek adreslerini tutan göstericiler(pointer) hala kullanılabilmektedir. JAVA dilinde bu imkan yoktur. C#’ı JAVA dan ayıran en büyük fark budur. Zira gösterici kullanımı sayesinde geriye dönük uyumlulukta sağlanabilmektedir. Örneğin parametre olarak bir gösterici alan sistem fonksiyonunu C#’ta kullanmak mümkündür.
7-) Veri Tipleri : C# dilinin temel felsefesi herşeyin bir nesne olmasıdır. Temel veri türleride dahil olmak üzere herşey birer nesne olarak tanımlanır. C# ve JAVA sağladığı temel veri türleri bakımından birbirlerine çok yakındır.
😎 Tekrar Kullanılabilirlik : Nesne yönelimli programlama modelinin en önemli özelliği geliştirilen sınıfların paketlenerek sonradan tekrar tekrar farklı uygulamalarda kullanılabilmesidir. C#’ ta sınıflar isim alanları(namespace) içerisinde paketlenerek diğer uygulamalar içinde kullanılabilir. Java’da ise sınıflar “package” dediğimiz bir kavramla paketlenir. Sonuç olarak her iki dilde eşit oranda bu özelliği desteklemektedir. Ancak C#’ta sınıfların organizasyonu daha estetik bir şekilde düzenlenmektedir.
9-) Kontrol Mekanizmaları : Kodların içinde en çok görülen bloklar olan for,while ve if gibi yapılar her iki dilde de vardır. C#’ta JAVA dilinde olmayan ayrıca foreach döngüsü bulunmaktadır. foreach döngüsü ile koleksiyon tabanlı nesnelerin elemanları arasında tek yönde rahatça dolaşılabilmektedir.
10-) Türetme ve Çok Biçimlilik : Nesne yönelimli programlama modelinin C++ dilinden beri kullanılan mekanizmaları olan türetme ve çok biçimlilik her iki dilde de mevcuttur. C++’tan farklı olarak C# ve Java’da sadece tekli türetme mevcuttur.
11-) İstisnai Durumları Yönetme : Uygulamların en büyük düşmanı olan istisnai durumların(exceptions) her iki dilde de ele alınış biçimi hemen hemen aynıdır.
12-) Sınıf Kütüphanesi : Veritabanı ve dosya işlemleri gibi burada sayamayacağımız bir çok temel işi yapan sınıflar .NET ve J2EE platformunda mevcuttur. Gerek bu sınıfların organizasyonu gerekse de sınıfların kullanılış biçimi bakımından .NET platformunun daha avantajlı olduğunu söyleyebiliriz.
Bütün bu maddeler bir bütün olarak ele alındığında C#’ın JAVA’dan bir kademe önde olduğu görülmektedir. Bu durum elbette proje yöneticilerinin seçimlerini etkilemektedir. Microsoft faktörünüde göz önünde bulundurursak C# ve .NET’in gelecekte çok iş yapacağını söylemek için müneccim olmaya gerek yok. Bu arada JAVA’nın halen yaygın bir şekilde kullanıldığını da gözardı etmemeliyiz. Bu durum C# ve JAVA’nın seçiminde sadece teknik özelliklerin değil aynı zamanda Windows ve Linux’te olduğu gibi sosyal etkenlerinde rolü bulunduğunu gösteriyor.
Buraya kadar söylediklerimden belki şöyle bir soru işareti doğmuş olabilir : “C# mı JAVA mı” sorusunu “C# mı C++ mı” şeklinde sorsak neler değişir? Cevap : Çok şey değişir. Evet C#’ın JAVA ile olan ilişkisi C++ ile olan ilişkisinden tamamen farklıdır. C# ile JAVA’yı ancak saf dil olarak karşılaştırabiliriz. Yani dilin sentaksından bahsediyorum. Bu iki dilin kullanıldığı ortam farklıdır. Birinde bir sisteme özgün makine kodu üretilirken diğerinde sistemden bağımsız ara bir kod oluşturulmaktadır. Bu durumda C++ ve C#’ı bir bütün olarak karşılaştırmayı kişisel olarak doğru bulmuyorum. Çünkü ikisi farklı kategorilerde yarışıyor. Eğer bir gün .NET’in ürettiği ara koddaki komutlar ile çalışan mikroişlemci geliştirilirse o zaman belki C# ile C++’ı karşılaştırabiliriz. Peki C# mı C++? Cevap : Her ikiside. Eğer şirketiniz Intel işlemciler için bir işletim sistemi geliştiriyorsa elbette C++ ve C dilleri seçilmelidir. Şirketiniz dağıtık yapıda çok geniş bir çalışma ağı olan bir uygulama geliştiriyorsa o zaman C# ve .NET’i seçmeniz daha doğru olacaktır. Bu seçim bir projede hangi dilin kullanılacağını değerlendirmek içindi. İşe bir de programcılar açısından bakalım. Bir programcının hem C++ hem C# hemde JAVA bilmesine gerek var mı? Bence gerek var yada yok. Kesin bir cevabı verilemez bu sorunun. Daha doğrusu bir programcı ihtiyaç dahilinde herhangi bir programlama dilini kullanabilmelidir. Ancak şunu da unutmayalım ki iyi bir programcı çok sayıda programlama dili bilen demek değildir. İyi bir programcı .NET platformunda olduğu gibi programlama dilinden bağımsız kod üretebilmelidir.
Diğer .NET Dilleri ve C#
Daha öncede dediğim gibi .NET paltformunda bir çok programlama dilini kullanabiliriz. Bu dillerin en önemlileri C#, VB.NET, C++.NET ve J# dilleridir. Bu dillerden bir tanesinin özel bir konumu vardır. Tahmin edeceğiniz gibi bu dil C#’tır. C# .NET platformu için sıfırdan geliştirilmiş yeni bir dildir. Diğer diller ise eski versiyonları değiştirilerek .NET’e uyumlu hale getirilmiştir. Özellikle Visual Basic dilinin devamı gibi görünen VB.NET dilinde bir çok radikal değişiklik yapılmıştır. Örneğin VB dili nesne yönelimli programlama tekniğini destekler hale getirilmiştir. Bu eklentilerin çok başarılı oloduğu söylenemez. Çünkü bu şekildeki zoraki eklentiler dilin en başta tasarlanma amacına uygunluğunu ortadan kalkmaktadır. Bu amaçla Microsoft, hem nesne yönelimli programlama tekniğine tam destek veren, C++ dilinin güçlü özelliklerinden yoksun olmayan ve aynı şekilde Visual Basic dilinin kolaylığından esinlenerek C# dilini çıkardı.
Peki .NET dilleri arasında C#’ı tercih etmemize neden olacak başka neler var? Her şeyden önce C# öğrenilmesi kolay bir dildir. Az sayıda anahtar sözcük içermesine rağmen bir çok olanağı programcının hizmetine sunmuştur. C# nesne yönelimli programlama diline tam destek verdiği içinde seçilebilir. C#’ta değişken kavramı neredeyse kalkmıştır. Bunda bütün temel veri türleri de dahil olmak üzere bütün sınıfların Object diye adlandırılan bir sınıftan türetilmesinin etkisi vardır. C# dili güç ve hızlılık arasındaki dengeye estetik bir şekilde korumaktadır. Temsilci ve olaylarla VB’deki olay mantığına benzer bir model sunarken aynı zamanda göstericileri kullanmaya imkan vererek C++ dilinin güçlü özelliklerinden yoksun bırakmamıştır. .NET sınıf kütüphanesinin büyük bir kısmı C# ile geliştirilmiştir. Yani bu kütüphaneyi en etkin biçimde C# ile kullanabiliriz. Dahası C# dili .NET’in çalışma mimarisi de gözönünde bulundurularak sıfırdan tasarlandığı için .NET’in bütün olanaklarından en etkin biçimde C# ile faydalanabiliriz.
C# için söylenebilecek son söz : C#, modern programlama tekniklerine tam destek veren, internet çağının gerektirdiği tüm yazılım bileşenlerini geliştirmeye izin veren, hızlı ve etkin bir şekilde kodlama yapılabilen, C++ ve JAVA’nın güzel yönlerini alıp geriye dönük uyumluluğu JAVA’da olduğu gibi gözardı etmeyen bir programlama dilidir.
Sonuç
İnternet’in ve haberleşme teknolojisinin çok ileri bir seviyede olduğu bir dönemde internet üzerinde kullanılabilecek yazılım bileşenlerini programlamak son derece önem kazanmıştır. Her ne kadar C# ve JAVA öncesi dillerle herşey yapılabiliyor olsada projelerin boyutlarının büyümesi bu dillerin artık yetersiz olduğunun bir göstergesidir. Özellikle yeni nesil iş uygulamalarında C# ve JAVA, C++’tan bir adım önde görünüyor. Tabi bu durum C++ dilinin kötü olduğunu göstermez. Nitekim C# ve JAVA dillerinin her ikiside C++ dilini örnek almıştır. Değişen tek şey günün ihtiyaçlarıdır. Aynı zamanda C# dili JAVA, C++.NET, VB.NET ve J# gibi diller önünde de bir adım önde görünüyor.
