C# Eğitimi-1 (Giriş) Melih Hilmi Uludağ www.melihhilmiuludag.com
Nesne Yönelimli Programlama Nesne Yönelimli Programlama, 1990 lı yıllarda başlayan ve günümüzde de yoğun olarak kullanılan bir programlama teknolojisidir. Nesne Yönelimli Programlama'da, programlama ortamındaki her şey bir nesne olarak kabul edilir ve nesnelerin özellikleri değiştirilerek onlara yeni biçimler verilebilir. Ayrıca her nesnenin duyarlı olduğu durumlar da mevcuttur. Her nesne üzerine uygulanabilecek farklı metotlar oluşturulmuştur. Yapısal Programlama'da ağırlık programlama komutlarındayken, Nesne Yönelimli Programlama'da yazılımcının ortamdaki nesneler, bunların özellikleri, duyarlı oldukları olaylar ve nesnelere uygulanabilecek metotlar hakkında ayrıntılı bilgi sahibi olması gerekir. Faydaları: Yazılımın Bakım (Maintenance) Kolaylığı Genişletilebilirlik (Extensibility) Üretilen Kodun Yeniden Kullanılabilirliği (Reusability)
C# NEDİR? Microsoft'un geliştirmiş olduğu yeni nesil programlama dilidir. (Microsoft tarafından geliştirilmiş olsa da ECMA ve ISO standartları altına alınmıştır.) C programlama dilinde bir tamsayı değişkeni 1 attırmak için ++ soneki kullanılır. C++ dili adını, C diliyle Nesneye Yönelimli Programlama yapabilmek için eklentiler (C With Classes) almıştır. Benzer şekilde C++ diline yeni eklentiler yapılarak ((C++)++) bir adım daha ileriye götürülmüş ve tamamen nesneye yönelik tasarlanmış C# dilinin isimlendirilmesinde, + karakterlerinin birbirlerine yakınlaşmış hali ve bir melodi anahtarı olan C# Major kullanılmıştır.
Anders Hejlsberg C# programlama dilinin mimari 1990 lı yılların sonlarına doğru Microsoft un programlama dehası Anders Hejlsberg C# dilini yarattı. 2000 yılının ortalarında C# ın ilk alfa versiyonu piyasaya çıktı. C# programlama dili ; C, C++ ve Java ile bağlantılı bir dil olarak yapıldı. Bunun bir tesadüf olduğunu düşünmeyin. Bunlar dünyada en yaygın kullanılan ve sevilen dillerden üçüdür. Hejlsberg de aynı Stroustrup ve Gosling gibi tekerleği yeniden icat etmektense mevcut bir dili geliştirmeyi uygun görmüştür. Eğer bu diller arasında bir bağlantı kurmak gerekirse. C# programlama dili;. C dilinin söz dizimini ve C++ dilinin nesne yönelimli programlama yöntemlerini ve tekniklerini almıştır. C# ın Java ile olan ilişkisi ise özel bir durumdur. Zira C# ta Java gibi C ve C++ dillerinden özellikler almış ama aynı zamanda Java gibi platform bağımsız kod amaçlı tasarlanmıştır. Yani C# dili, Java dilinden türememiştir. En iyi tarafı ise C, C++, C# veya Java dillerinden birinde iyi olmanız diğer tüm dillerde de size büyük kolaylıklar sağlar.
C# ı Neden tercih edelim? C#, C/C++ dilinden farklı olarak tamamıyla nesneye yöneliktir. int, double gibi temel veri türleri dahi birer nesne olarak tanımlanmıştır. Java dilinden farklı olarak C# dilinde işaretçiler (pointer) kullanılabilmektedir. Öğrenilmesi kolaydır. Nesne yönelimli programlamaya tam destek vermektedir. Yüksek verim. Güçlü ve kolaydır. Xml desteği sunmaktadır. Windows Forms mantığını destekler. Internet teknolojilerinin gelişimine uyum sağlayabilmiş modern bir dildir.
.NET BİLEŞENLERİ C#, VB.NET, C++ vb. CLS Temel Dil Tanımlamaları ASP.NET, WİNDOWS FORMLAR CTS TEMEL SINIF KÜTÜPHANELERİ Ortak Dil Çalışma Platformu (CLR) (Common Language Runtime) İŞLETİM SİSTEMİ
Önceden, geliştirilen yazılımlar direkt olarak makine koduna derlenir ve bu şekilde çalıştırılırlardı. Ayrıca bu programlar, her işletim sistemine özel olarak geliştirilmekte ve derleme işlemi işletim sistemine göre belirlenmekteydi. Böyle bir yapıda taşınabilirlikten söz etmek mümkün değildir. Java da ise, program önce byte code a çevrilmektedir. Bu kodu JVM(Java Virtual Machine), işletim sisteminin istediği koda çevirmektedir..net platformunda da temel prensip Java ile benzerdir.
Java nın çalışma prensibini hatırlayalım: TAŞINABİLİRLİK
.Net Derleme ve Çalıştırma C# kodu MSIL veya IL Assembly. NET kodu önce IL (Intermediate Language-Ara dil) ye derler ve bu IL kodu çalıştırılmak istendiği zaman.net CLR (Common Language Runtime Ortak Çalışma Platformu), JIT (Just In Time) derleyicilerini kullanarak makine diline çevirir. CLR.Net Kodu Makine Dili Çalıştırılabilir Makine Kodu IL Kodu Bu işin yöneticisi: CLR, Bu işi Yapan: JIT Derleyicileri
En güzel yanı: Ortak çatı CLS (Common Language Specifications) :Temel Dil Tanımlamaları CTS (Common Type System) :Ortak Tip Sistemi CLS ve CTS ile.net uyumlu dillerin hepsi aynı değişkenleri ve benzer nesne yönelimli özellikleri taşır. Örn: C# ile yazılan programdaki temel veri tipleri, VB.NET tekiler ile aynı özelliklere sahiptir. Böylece farklı dillerde yazılan bileşenler birbiri ile sorunsuz çalışırlar.
CLR (Ortak Dil Çalışma Platformu) Program CLR İşetim Sistemi CLR,.NET altyapısında programların çalışmasını kontrol eden ve işletim sistemi ile programımız arasında yer alan arabirimdir. (Normalde yazılan kodlar makine diline çevrilir ve işletim sistemi ile direkt bağlantı kurup çalışırdı. )
IL kodu, CLR tarafından çağrılınca JIT derleyicileri tarafından makine diline çevrilir ve çalıştırılır. Eğer çok sayıda platform olduğunu düşünürsek, programların bunlar için ayrı ayrı yazılıp derlenmesi gerekir. Bu durum imkansız gibidir. Platformdan bağımsız bir ortam istiyorsak, ihtiyaç duyulan şey CLR dir, hangi platformda iseniz (Linux,Mac,Windows) CLR bu noktada devreye girer ve.net programlarının farklı platformlarda işletim sistemine göre çalıştırır.
Aradil(IL veya MSIL)(Intermediate Language).NET ortamında kodumuzu derlediğimizde elde ettiğimiz IL (ara dil) kodu işlemciye bağlı olmaz. (a ve b sayılarının toplamı için kullanılan bir C++ programı Intel işlemciler için farklı, SunSparc işlemciler için farklı derlenirdi.) IL içerisinde değişken tanımları, değişkenlerin nasıl saklanacağı, metotların nasıl çalıştırılacağı, aritmetik ve mantıksal işlemler, bellek kullanımı gibi birçok işin nasıl yapılacağı açıklanır. KOD Metadata da, programda kullanılan verilerin tiplerinin yanında oluşturulan sınıfların metotlarını ve bunların özelliklerini ve diğer bilgileri içerir. Kod kısmında ise, derleyici tarafından dönüştürülmüş arakodlar vardır. METADATA
Jıt Derleyicileri(Just in Time) C# ile IL ye derlediğimiz programı çalıştırırken JIT derleyicileri devreye girerler. Bu derleyiciler programın çalıştırıldığı sistemin ve işlemcinin anlayabileceği makine kodunu oluştururlar. Windows ortamı için 3 çeşit JIT mevcuttur 1. Normal JIT : IL kodu makine koduna çevrilirken default (varsayılan) olarak kullanılan derleyicidir. IL kodunu orijinal makine koduna çevirir ve önbellekte tutar. Örneğin ; program içindeki bir derlenmiş bir metot program akışı içinde tekrar çağrılırsa önbellekten çekilir. 2. Pre-JIT :Tüm program kodunu makine koduna çevirip sonra çalıştıran JIT. Fazla hafıza gerektirir. Programın daha hızlı çalışmasını sağlar. 3. Eco JIT : Kısıtlı hafıza ve önbellekli sistemlerde.net programlarının daha iyi çalışmalarını sağlamak için kullanılan derleyicidir. Eco JIT de kullanılabilir hafıza belli bir oranın altına düştüğünde, daha önceden derlenmiş ve çalıştırılmış kısımlar hafızadan silinirler.
CTS (Common Type System) Bütün veri tiplerinin tanımlı olduğu bir sistem olarak düşünebiliriz. C# dilindeki veri türleri aslında CTS deki veri türlerine karşılık gelen ara yüzlerdir. CTS sayesinde.net platformu için geliştirilen bütün diller aynı veri tiplerini kullanırlar, tek değişen türlerin tanımlama yöntemi ve söz dizimidir. Geliştirilen bir nesnenin diğer dillerde de sorunsuz çalışmasını garanti eder. Örnek: Int tipi C++.NET ve VB.NET teki tamsayı tiplerinin kapasiteleri aynıdır. Diğer bir deyişle VB de geliştirilen bir dll C# da rahatlıkla kullanılabilir.
CTS sayesinde;.net de tip güvenli, yüksek performanslı ve kullanılan programlama dilinin diğer.net uyumlu diller ile entegre bir şekilde çalışması sağlanır. Birçok programlama dilinin.net mimarisinde tam nesne yönelimli olarak.net için program yazma aracı olmasına imkan verir. Herhangi bir.net uyumlu dilde geliştirilen nesne diğer dillerde de sorunsuz olarak çalıştırılabilir.
Değer Tipleri Veri Tipleri Referans Tipleri C# da toplam 15 veri tipi vardır bunlardan 13 ü değer tipindedir, 2 si ise referans tipindedir. Değişkenler bellekte bulunan verilerdir. Bir değişkeni kullandığımız zaman o değişkenin bellekte bulundu yerdeki bilgiyi kullanırız. Değer tipleri veriyi direk olarak bellek bölgesinden alırken referans tipleri başka bir nesneye referans gösterirler. Yani referans tipleri içinde veri değil adres bilgisi tutarlar. Veri tipleri stack dediğimiz bellek bölgesinde tutulurlar, referans tipleri ise heap bellek bölgesinde saklanırlar. int, double, float gibi veri tipleri değer tiplerine örnek gösterilebilir. Herhangi bir sınıf türü ise referans tipine örnek gösterilebilir. Değer tipleri birbirine eşitlenirken değişkenin barındırdığı değer bir diğer değişkene kopyalanır. Böylece iki farklı bağımsız değişken oluşur. Referans tipleri ise eşitleme sırasında değişkenlerin taşıdıkları veri değil heap bölgesinde işaret ettikleri adres kopyalanır. Böylece eğer iki referans değişkeni birbirine eşitledi isek ve daha sonra bunlardan birinde bulunan veriyi değiştirdi ise otomatik olarak diğer referans değişkeninin değeri de değişir. Çünkü adreste bulunan veri değişince bu adresi işaret eden iki değişkende yeni veri bilgisine ulaşır.
CLS (Common Language Specification CLS ye uyan bir dille yazılmış kod ile diller arası iletişim sağlanmış olur. CLS uyumlu bir dil ile geliştirilen bir program ile farklı diller arasında etkileşim sağlanabilir..net in temel sınıf kütüphanelerinin içerisinde yer alan kodların büyük bir bölümü CLS uyumludur.
CLS için
CLS nin avantajları Kod yönetimi(code Management ): Loading ve Execution *Uygulama belleginin izolasyonu *Tip güvenliginin(type safety ) dogrulanmasi IL(Intermediate Language ) kodunun dogal makina koduna(native code ) dönüsümünün saglanmasi *Metadata(tipe ait detaylandirilmis bilgiler ) bilgisine erisimin saglanmasi *Yönetilebilir nesnelerin(managed object ) bellek yönetiminin saglanmasi *Kod erisim güvenliginin(code access security ) uygulanmasi *Istisna yönetimi(exception Management ) *Yönetilebilir kodlar, COM nesneleri ve hazir DLL lerin birbirleri arasinda isletimlerinin saglanmasi *Nesne otomasyonunun saglanmasi *Uygulama gelistiriciler için servislerin saglanmasi(debugging vb. )
Namespaces and.net Class Library (İsim Alanları ve.net Sınıf Kütüphanesi).NET teki sınıf kütüphaneleri bir dilden bağımsız bir yapıdadır. Bütün bu sınıfları ve türleri iyi organize edebilmek için.net, isim alanı (namespace) kavramını kullanmaktadır. C# dilinde.net Framework sınıf kütüphanesi içerisindeki veri türleri ve sınıflar using anahtar sözcüğü ile kullanılır. Diğer dillerde de bu isim alanları farklı şekillerde derleyiciye bildirilir. (Java da import, C de include gibi)
.NET sınıf kütüphanesinde bulunan ve en sık kullanılan sınıf kütüphaneleri şunlardır: System:.NET ile çalışırken gerekli temel sınıfları içerir. Ayrıca diğer tüm sınıf kütüphaneleri bu isim alanı içinde kümelenmiştir. Konsol temelli uygulamalarda temel giriş çıkış işlemleri için gerekli temel sınıf Console, bir çok matematiksel fonksiyonu içinde barındıran Math sınıfı da System isim alanı içersinde yer alır. System hiyerarşinin tepesinde bulunur. System.Data: Veritabanı işlemlerinin tamamı için hazır gelen sınıf kütüphanesine bu isim alanı ile erişilir. Bu sınıf kütüphanesi içindeki SQL ile işlemler için System.Data.SqlClient isim alanı mevcuttur. System.Xml: Veri biçimlendirme ve internetten veri paylaşımı için en çok kullanılan teknolojilerden biri olan XML ile çalışmak için gerekli sınırları içerir. System.Net: Dağıtık uygulama geliştirmek için gerekli olan ağ bileşenlerini içeren isim alanıdır. HTTP ve ağ protokolleri için kullanılır.
System.IO: Dosyalarla çalışmak (okuma/yazma) için gerekli işlemlerini içerir. System.Windows.Forms: Windows temelli uygulamalarda kullanılan görsel kontrolleri barındıran isim alanıdır
Kaynaklar Yrd.Doç.Dr. Erkan Tanyıldız, Nesne Tabanlı Programlama ders notları https://gelecegiyazanlar.turkcell.com.tr http://tr.wikipedia.org/wiki/ Beni dinlediğiniz için teşekkürler. Haftaya daha somut şeylerle görüşmek üzere Melih Hilmi Uludağ www.melihhilmiuludag.com adresinden bu dökümana erişebilirsiniz.