Introduction to C# and .Net (C# ve .Net’e Giris)

Merhabalar,

Bir önceki yazimda C# dilini daha etkin kullanabilmek için Roadmap‘i açikladim. Roadmap’in ilk konusu ve ayni zamanda bu yazinin basligi olan C# ve .Net’e giris hakkinda elde ettigim yararli bilgileri paylasacagim.

Blog yazma isi aslinda epeyce zahmetli bir is belki de yeni oldugum için olabilir. Blog yazmaya baslamaya karar verdigimde ne tür yazi ile baslamaliyim ikileminde çok kaldim. O yüzden kendime ilk basta bir konu belirledim ve daha sonra kendime artik bir yerden baslamaliyim dedim. Sizde buna benzer ikilem içinde kaliyorsaniz ve hayalinizi gerçeklestirmekte zorlaniyorsaniz muhtemelen atalet içindesiniz. Ataletten bir an önce kurtulun ve hayalini kurdugunuz düsüncelerinizi yapmaya baslayin. Zaman kisa ve çok degerli.

Bildiklerimi aktarmaya karar verdikten sonra her gün aklima bu sekilde paylasirsam daha iyi olur, baslarken bunlari yaparsam daha etkili olur vs.. gibi düsünceler geliyor. Bunlarin ilki motivasyonumu saglayacak cümleler ile baslamak olacak. Bu yazinin motivasyon cümlesi ile baslayalim.

Baskalarinin dogrularini yasamak yerine kendi yanlislarinizla gurur duyun

Pinkfreud

Bu ve bundan sonraki konu içerikleri yazilim dillerinde genel kültürümüzü artirmayi hedeflemektedir. Her seyi tek seferde yogun bir sekilde ögrenmek üst üste tugla dizmeye benzer. En ufak sarsintida yikilir. Bu tuglalari mola vererek adim adim dizersek aralarindaki bag güçlenir ve çok saglam bir duvar dizmis oluruz. Hadi simdi giris yapalim.

C# ve .Net’e Giris (Introduction to C# and .Net)

C# Nedir?

C#, C/C++ ve Java dillerinden ilham alan güçlü, basit, esnek, tip güvenli, modern ve Microsoft .Net Platformu için sifirdan gelistirilmis orta düzeyli dil olan tek programlama dilidir.

Bilgisayar dilleri düzeylerine göre su sekilde siniflandirilabiliriz.

Neden C#?

  • C# dili ögrenilmesi kolay bir dil olmasi
  • Nesne Yönelimli Programlamaya tam destek vermesi
  • Yüksek verim alinmasi
  • Güç ve kolaylik arasindaki dengeyi saglamasi
  • Xml Destegi ile baska sistemlerle etkilesime geçebilmesi
  • Yönetilmeyen kod (Unmanaged Code) uyumlulugu olmasi
  • VB’deki Olay(event) ve Form mantigini desteklemesi
  • Modern bir dil olmasi

C#’in .NET’teki Yeri ve Kullanim Alanlari

  • Konsol Uygulamasi Gelistirme araci
  • Windows için program yazma
  • Asp.Net içi en uygun dil
  • Web Servisler
  • Mobil Uygulama Gelistirme
  • C# ile Dll olusturma.

.Net Bilesenleri

Microsoft .NET çok katmanli ve dagitik uygulama gelistirme modellerini benimsemistir.

.NET Mimarisinde 4 ana bilesen vardir.

  • Common Language Specification (Yesil)
  • Framework Class Library (Turuncu)
  • Common Language Runtime (Sari)
  • Micosoft Tool (Mavi)

.NET Kodu önce IL(Aradil) derler ve bu IL kodu çalistirilmak istendigi zaman .NET CLR (Common Language Runtime) JIT Derleyicilerini kullanarak makine diline çevirir. Fakat CLR makine diline çevrilmis kodu önbellekte tutar. Bu büyük performans artisina sebeb olurken sistemin hafizasinda küçümsenmeyecek kadar yer isgal eder. O yüzden yazdigimiz kodlari gözden geçirip performansi ölçmeliyiz. Bunun için birçok Araç mevcut.

Temel dil tanimlari (Common Language Specification) ve Ortak Tip Sistemi (Common Type System) ile .NET uyumlu dillerin hepsi ayni degiskenlikleri ve benzer nesne yönelimli özellikleri tasimak zorundadir.Örnegin C# ile yazdigimiz DLL’lerde yer alan temek veri tipleri, VB.NET’tekiler ile ayni özelliklere sahiptirler. Bu sayede farkli dillerde yazilan bilesenler birbirleri ile sorunsuz çalisirlar.

Ortal Dil Çalisma Platformu (CLR – Common Language Runtime)

Ortak Dil Çalisma Platformu (CLR) .NET alt yapisinda programlarin çalismasini kontrol eden ve isletim sistemi ile programlarimiz arasinda yer alan bir arabirimdir.

CLR ve .NET Programinin Derlenip Çalistirilmasi

Platformdan bagimsiz gelistirme ve yürütme ortami istiyorsak ne olacak? Iste tam bu anda CLR devreye girer ve .NET programlarinin farkli platformlarda makineye ve isletim sistemine göre programimizi çalistirir.

C# ile yazdigimiz program kodu içine ilgili diger DLL ve COM bilesenlerini ve .NET sinif kütüphanesinde bulunan ve program kodunun içinde kullandigimiz kütüphaneler ile birlikte derlenip, IL (Microsoft Intermediate Language – Microsoft Ara Diline) çevrilir. Burada olusturulan Assembly herhangi bir sistemde (Linux veya MAC OS olabilir) CLR tarafindan çalistirilabilir. IL kodumuz CLR tarafindan çagrilinca JIT derleyicileri tarafindan makine diline çevrilip çalistirilir.

IL (Intermediate Language – Aradil)

Herhangi bir C++ ve VB kodu direk olarak makine diline çevrilirdi ve çalistirilirdi. Makine diline çevrilen programlari derleyici islemci için özel olarak çevirir. Mesela, iki sayiyi toplayan C++ programi Intel islemcilerle Sun Sprac islemciler için farkli farkli derlenir. Ama .NET’te kodumuzu derleyip elde ettigimiz IL kodu islemciye bagimli bir kod degildir. IL tasinabilir ve daha geneldir.

IL içinde, degisken tanimlari, degiskenlerin nasil saklanacagi, metotlarin nasil çalistirilacagi, aritmetik islemler, mantiksal islemler, bellek kullanimi ve hata ayiklama ve yönetimi dahil birçok isin nasil yapilacagi açiklanir.

JIT Derleyicileri

C# derleyicisi ile IL’ye derledigimiz programi çalistirirken JIT (Just in Time) derleyici devreye girer. Bu derleyiciler programin çalistigi sistemin ve islemcinin anlayacagi makina kodunu olustururlar. JIT derleyicilerin Windows ortami için 3 farkli versiyonu vardir. Bunlar:

  1. Normal JIT: Il kodu makine diline çevrilirken varsayilan olarak kullanilan JIT derleyicisi IL kodunu orjinal makine koduna çevirp önbellekte tutar.
  2. Pre-JIT: Programlarin çalismasini daha hizli hale getirmek için kullanilmasi tasarlanan Pre-JIT derleyicisi tüm program kodunu makine koduna çevirip sonra çalistirir.
  3. Eco-JIT: Kimi sistemlerin az miktarda hafizalari ve önbellekleri vardir. Bu sistemlerin .NET programlarinin daha iyi çalismalarini saglamak için Eco-JIT derleyicileri uygun bir çözümdür.

CTS ve CLS

.NET’in Common Type System (CTS – Ortak Tip Sistemi) özelliklerinden dogan, programlama dillerinin kullandigi veri türleri arasinda uyumluluk vardir. Mesela C# dilinde kullanarak gelistirdigimiz bir programdaki tam sayi (bu int olabilir) tipindeki degisken ile C++.NET ve VB.NET’teki tamsayi tiplerinin kapasiteleri aynidir. Bu sayede herhangi bir VB.NET Dll’ni C# programimizda gönül rahatligi ile çalistirip kullanabiliriz.

CTS Özellikleri

  • .NET mimarisinde tip güvenli, yüksek performansli ve kullandigimiz programlama dilinin/dillerinin diger .NET uyumlu diller ile entegre bir sekilde çalismasini saglar.
  • Birçok programlama dilinin .NET mimarisinde tam nesne yönelimli olarak .NET için program yazma araci olmasina imkan verir.
  • Herhangi bir .NET uyumlu dilde gelistirilen nesnenin diger dillerden de sorunsuz olarak çagrilabilmesini garantiler.

Not: Ortak Tip Sisteminde (CTS), veri tipleri iki ana kisma ayrilir. Bunlar: deger(value) ve refetans (refetence) tiplerdir.

.NET platformu dilleri arasinda uyumlulugu saglamak için sadece veri tiplerinin uyumlu olmasi yetmeyecektir. Program kodunu yazdigimiz dilin Ortak Dil Spesifikasyonuna da (Common Language System) uyumlu olmasi gerekir. Yani CLS’e uyumlu bir dille yazdigimiz kodla diller arasi etkilesim saglariz.

Not:Bu kurala uyan diller basta C#, C++.NET, VB.NET ve Jscript.NET olmak üzere otuzdan fazladir.

Assembly Kavrami

Burada üzerinde duracagimiz Assembly kavraminin, düsük düzey bir dil olan Assembly dili ile bir alakasi yoktur. Sadece ortada bir isim benzerligi vardir. .NET platformu için yazacagimiz bütün kodlarin sonucunda olusan exe ve dll uzantili dosyalara genel olarak assembly denilmektedir. Projeye ait derlenmis kodlar ve metedata diye adlandirdigimiz özniteleyici kodlar Assembly içinde bulunurlar.

Assembly’lerin Özellikleri

  • Assembly’lerin içinde yer alan metedata olarak adlandirlilan verileri, Assembly’deki tür bilgilerini ve baska kaynaklara olan baglantilarini saklarlar.
  • Assembly’de (dll ya da exe) version bilgisi tutulur. Hatirlarsaniz klasik dll ve exe tipi dosyalarda version bilgileri tutulmadigi için çesitli uyumsuzluklar yasanmaktaydi. Mesela, farkli iki firmanin hazirladigi dll’ler ayni isimli oldugundan sonradan register edilen dll, hali hazirda bulunan dll’in üzerine yazildigi için sistemde bulunan bazi uygulamalarda sorun çikiyordu. Kisace buna DLL Hell (DLL Cehennemi) deniyordu.
  • Assembly’lerde version bilgisi sakladnigi için uygulama içinde farkli versiyonlara sahip Assembly’ler kullanabiliriz.
  • Program kurma islemi, Assembly’ye iliskin dosyalari direkt kopyaliyarak yapilabilir.

Application Domain Kavrami

Assembly’lerin en önemli özelliklerinden biri de, Application Domain dedigimiz kavramdir. Domain sayesinde ayni anda çalisan birden fazla program veya proses birbirinden izole edildigi halde sistemde herhangi bir aksakliga yol açmadan aralarinda veri alisverisi yapabilir.

Burada klasik bir örnek vermek gerekirse, normal ASP modelinde web sunucusuna ayni anda birden fazla kisi baglanir ve her biri için yapilan islemlerin farkli olmasi ve birinde herhangi bir sorun olmasi durumunda web sunucusu hizmet disi kalabilir. Ama ASP.NET’te bu tür problemler Application Domain sayesinde ortadan kalkmistir. Yani her web sitesini ayri bir App Domainde host ederek herhangi bir sitede hata alindiginda diger siteler etkilenmeden çalismasina devam eder.

Not: Application domain’e yüklenen assembly’ler deki siniflar serilestirilebilir (Serializable) olmali yada MarshalByRefObject sinifindan türemelidir.

Asagidaki sekilde görüldügü gibi prosesler içinde bir veya birden fazla Application Domain’ler yine bir ve birden fazla Thread ile çalistigini görüyoruz.

Isim Alanlari ve .NET Sinif Kütüphanesi

Programlama dillerinde programcilarin islerini kolaylastirmak için bir takim hazir kütüphaneler bulunmaktadir. Bu kütüphanelerden bazilari standart olmak üzere bazilari programcilar tarafindan sonradan gelistirilmis ve kullanicilarin hizmetine sunulmustur.

Isim alanlari .NET Framework sinif kütüphanesindeki veri türleri ve siniflari C# dilinde using anahtar sözcügü ile birlikte kullanilir ve derleyiciye bildirilir.

Programimizi yazarken birbirleriyle ilgili olarak gelistirdigimiz siniflarin ayni isim alani içinde olmasi program yazma, program hatalari bulma ve programimiza yeni özellikler ekleme asamalarinda büyük fayda saglar.

Not: Microsoft kullanicilari isim alanlarini adlandirirken bir takim temel kurallara uymamizi tavsiye ederler. Mesela bir kütüphane gelistirdigimizi var sayarsak, öncelikle isim alanlarimizin basina sirketimizin ismini yazip araya nokta koyduktan sonra isim alanimizin ismini yazmamiz tavsiye ediliyor. Örnek verecek olursam:

MertKimyonsenBlog.CSharpProgramlamaKlavuzu seklinde olmalidir.

System

System isim alani, .NET ile çalisirken gerekli temel siniflari içerir. Ayrica diger tüm sinif kütüphaneleri bunun içinde kümelenmistir. Detayli bilgiye buradan erisebilirsiniz. System Namespace

System.Data

Tüm veritabani islemleri için hazir hale gelen sinif kütüphanelerine System.Data isim alanindan erisilir. Bu sinif alaninda dört temel alt isim alani bulunur. Bunlar:

  • System.Data.Common: Veritabani islemleri için genel olarak tanimlanmis islev ve siniflari içerir.
  • System.Data.OleDb: OLE veritabani sürücüleri vasitasiyla birçok veri kaynagiyla çalisabilmemiz için gerekli siniflari içerir.
  • System.Data.SqlClient: Microsoft SQL veritabani için özel olarak optimize edilmis etkili özellikleri sunar.
  • System.Data.SqlTypes: .NET mimarisinde Microsoft SQL veritabani içerisinde tanimlanmis veri tipleri üzerinde islemlere ve özelliklere erismek için bu isim alaninu kullaniriz.

System.Xml

Veri biçimlendirme ve internetten veri paylasimi için en uygun yol olarak görülen XML verileri ile çalismak ve onlari etkin bir biçimde .NET mimarisinde kullanabilmek için gelistirilmistir.

System.Net

.NET mimarisinde, basta HTTP protokolü olmak üzere, ag programlama için ihtiyacimiz olan tüm siniflara buradan erisebiliriz.

Dahasi System.Net.Sockets alt isim alani ile Windows ortaminda ag programlama için kullanilan WinSock’un .NET için yazilmis arayüzüdür.

System.IO

Dosyalardan veri okumak ve yazmak için elimizin altinda buluna System.IO isim alani sayesinde çok fazla hata çikabilecek I/O (Input/Output) islemlerini daha kolay bir sekilde halletmemiz saglanmistir.

Genel hatalari ile C# ve .NET’e giris yaptik. Bir sonraki yazimda Temel Veri Türleri hakkinda ilginç buldugum bilgileri aktaracagim. Görüsmek dilegiyle…

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik,

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/index

Leave a Comment