if kullanımı

if İfadesi
C#‟ın koşul ifadesini kullanarak programın bir parçasını seçerek çalıştırabilirsiniz. Bu koşul ifadesi if’dir. C#’taki if ifadesi diğer dillerdeki if ifadesine çok benzer şekilde çalışır. Örneğin, C#‟taki if ifadesi C, C++ ve Java’daki if ifadeleriyle aynı söz dizimine sahiptir. Bu ifade en basit şekliyle şöyledir:
if(koşul) ifade;
Burada, koşul bir Boolean (yani, true (doğru) veya false (yanlış)) deyimdir. Eğer koşul doğruysa, ifade gerçeklenir, koşul yanlış ise ifade atlanır. İşte bir örnek;

Bu örnekte 10, 11‟den küçük olduğu için koşul deyimi doğru olur ve WriteLine() gerçeklenir. Ancak, bir de aşağıdakine bakın:
if (10 < 9) Console.WriteLine(―this won’t be displayed”);
Bu durumda 10, 9‟dan küçük değildir. Yani, WriteLine() çağrısı gerçeklenmeyecektir. C#, koşul deyimlerinde kullanılan ilişkisel operatörlerin tam kadro tanımını içerir. Bunlar aşağıda gösterilmiştir:
Operatör Anlamı
< Küçüktür
<= Küçüktür veya eşittir
> Büyüktür
>= Büyüktür veya eşittir
== Eşittir
!= Eşit değildir
Aşağıda, if ifadesini gösteren bir program örneği bulunuyor:
// if’i tanitir. using System;
class IfDemo {
public static void Main() {
int a, b, c;
a = 2; b = 3; if(a < b) Console.WriteLine(“a is less than b”);
// bu, ekranda hicbir sey göstermez
if(a == b) Console.WriteLine(“you won’t see this”}; Console.WriteLine();
c = a – b; // c, -1 degerini icerir

Okumaya devam et “if kullanımı”

Kalıtım nedir?

Kalıtım

Kalıtım (inheritance), bir nesnenin diğer bir nesnenin özelliklerini ele geçirebilmesini sağlayan bir yöntemdir. Bu önemlidir, çünkü kalıtım, hiyerarşik sınıflandırma kavramını destekler. Bir düşünürseniz, bilgilerin büyük bölümü hiyerarşik (yani, yukarıdan aşağıya doğru) sınıflandırma sayesinde yönetilebilir kılınır. Örneğin, kırmızı tatlı elma, elma sınıflandırmasının bir parçasıdır. Elma, meyve sınıfının bir parçasıdır. Meyve ise daha büyük bir sınıf olan yiyecek sınıfının altında yer alır. Yani, yiyecek sınıfı, aynı zamanda mantıksal olarak kendisinin bir alt sınıfı olan meyve sınıfına da uygulanabilecek belirli özelliklere (yenilebilir, besleyici vs.) sahiptir. Bu özelliklere ek olarak, meyve sınıfının da kendisini diğer sınıflardan ayırt eden, kendisine özgü özellikleri (sulu, tatlı vs.) vardır. Elma sınıfı bu tür özelliklerden elmaya özgü olanları (ağaçta yetişir, tropik meyve değildir vs.) tanımlar. Kırmızı Tatlı elma bu durumda, kendisinden önce gelen tüm sınıfların tüm özelliklerini kalıtım yoluyla devralacaktır ve bu özelliklerden sadece kendisini eşsiz kılanları tanımlayacaktır.

Kalıtım kullanılmasaydı, her nesne kendi özelliklerinin tümünü açıkça tanımlamak zorunda kalacaktı. Kalıtım sayesinde bir nesnenin kendi sınıfı içinde sadece kendisini eşsiz kılan özellikleri tanımlaması yeterlidir. Nesne, genel özelliklerini atalarından kalıtım yoluyla devralabilir. Böylece, bir nesnenin daha genel bir durumun spesifik bir örneği olmasını mümkün kılan, kalıtım mekanizmasıdır.

Çok Biçimlilik nedir?

Çok Biçimlilik nedir?

Çok biçimlilik (polymorphism – Yunanca’da “birçok form” anlamına gelir), genel bir etkinlikler sınıfına erişmek için bir arayüze imkân veren bir özelliktir. Çok biçimliliğin en basit örneği, otomobil direksiyonudur. Gerçekte hangi tipte bir vites mekanizması kullanılırsa kullanılsın direksiyon (arayüz) hep aynı şekildedir. Yani, arabanız ister manuel vitesli, ister otomatik vitesli olsun, direksiyon hep aynı şekilde çalışır, Böylece, direksiyonu sola çevirmek, hangi tipte vites kullanılırsa kutlanılsın arabanın sola dönmesine neden olur. Tek tip bir arayüzün avantajı, elbette, direksiyonun nasıl çalıştıracağınızı bildikten sonra herhangi bir tipte arabayı sürebilecek olmanızda yatar.

Aynı prensip programlamaya da uygulanabilir. Örneğin, bir yığın (ilk giren son çıkar esasına dayanan bir liste) düşünün. Üç farklı tipte yığına gereksinim duyan bir programınız olabilir. Öyle ki, yığınlardan biri tamsayılar için, biri kayan noktalı değerler için, diğeri de karakterler için kullanılmaktadır. Bu örnekte, yığınlarda saklanan veriler farklı bile olsa, yığınların her birini gerçekleyen algoritma aynıdır. Nesne yönelimli olmayan bir dilde, her biri farklı bir isim kullanan üç farklı yığın rutini geliştirmeniz gerekecekti. Ancak, C#‟ta çok biçimlilik özelliğinden ötürü üç spesifik durumun üçüyle de çalışan tek bir genel yığın rutini geliştirebilirsiniz. Bu sayede, bir yığın kullanmayı öğrendiğiniz andan itibaren hepsini kullanabilirsiniz.

Daha genel bir yaklaşımla, çok biçimlilik kavramı sık sık “tek arayüz, çok sayıda metot” deyişiyle de ifade edilir. Bu, bir grup ilişkili etkinlik için genel bir arayüz tasarlamak mümkündür, anlamına gelmektedir. Çok biçimlilik, genel bir etkinlik sınıfını belirtmek amacıyla aynı arayüzün kullanılmasına imkân vererek karmaşıklığı azaltmaya yarar. Her bir durum için hangi spesifik etkinliğin (yani metodun) uygulanacağını tercih etmek derleyicinin görevidir. Siz programcıların bu tercihi elle yapmanıza gerek yoktur. Sizin sadece genel arayüzü hatırlamanız ve değerlendirmeniz gerekir.

İlişkili Verilerin Paketlenmesi

İlişkili Verilerin Paketlenmesi

Verilerin paketlenmesi (encapsulation), kodun manipüle ettiği verilerle kodu birbirine bağlayan ve her ikisini dışarıdan gelebilecek istenmeyen etkilerden ve hatalı kullanımlardan koruyan bir programlama mekanizmasıdır. Nesne yönelimli bir dilde kod ve veri, kendi kendisini içeren bir kara kutu oluşturacak şekilde birbirlerine bağlanabilir. Gerekli veri ve kodun tümü kutunun içinde mevcuttur. Kod ve veri bu şekilde bağlanınca bir nesne (object) oluşturulmuş olur. Diğer bir deyişle nesne, verilerin paketlenmesini (encapsulation) destekleyen bir aygıttır.

Nesne içindeki kod, veri veya her ikisi de bu nesneye özel (private) veya açık (public) olabilirler. Özel kod veya veri, sadece bu nesnenin parçaları tarafından bilinir ve erişilebilir. Yani özel kod veya veri, söz konusu nesnenin dışında kalan program parçaları tarafından erişilemez. Kod veya veri açık olduğunda ise, söz konusu kod ve veri bir nesnenin içinde tanımlanmış olsa bile programınızın diğer parçaları tarafından erişebilirler. Nesnelerin açık kısımları tipik olarak, özel öğelere kontrollü bir arayüz sağlamak amacıyla kullanılır.

C#‟ın temel veri paketleme birimi sınıftır (class). Sınıf, bir nesnenin şeklini tanımlar. Sınıf, hem verileri hem de bu veriler üzerinde işlem yapacak kodu belirtir. C#‟ta, nesneleri inşa etmek amacıyla sınıf spesifikasyonu kullanılmaktadır. Nesneler bir sınıfın örnekleridir. Yani, sınıf aslında bir nesnenin ne şekilde inşa edileceğini belirten birtakım planlardan ibarettir.

Sınıfı oluşturan kod ve veri söz konusu sınıfın üyeleri (members) olarak adlandırılırlar. Özellikle, sınıf tarafından tanımlanan verilerden üye değişkenler (member variables) veya örnek değişkenler (instance variables) olarak söz edilir. Metot (method), C#‟ta alt rutin için kullanılan bir terimdir. Eğer C/C++‟a aşinaysanız C# programcısının metot diye adlandırdığı şeyin C/C++ programcısı tarafından fonksiyon (işlev) olarak adlandırıldığını bilmek yararlı olabilir. C# dili C++‟tan doğrudan türediği için C# metotlarından söz edildiğinde fonksiyon (işlev) terimi de yaygın olarak kullanılmaktadır.

Nesne Yönelimli Programlama

Nesne Yönelimli Programlama

C#‟ın merkezinde nesne yönelimli programlama (OOP – Object Oriented Programming) yer almaktadır Nesne yönelimli yöntembilim C#‟tan ayrılmaz; tüm C# programları en azından bir ölçüye kadar nesne yönelimlidir. Nesne yönelimli programlamanın C# için öneminden dolayı, basit bile olsa bir C# programı yazmaya başlamadan önce nesne yönelimli programlamanın temel prensiplerini kavramak yararlıdır.

Nesne yönelimli programlama, programlama yaklaşımı için güçlü bir yöntemdir. Bilgisayarın icadıyla birlikte programlama yöntembilimleri, her şeyden önce programların artan karmaşıklığına uyum sağlamak amacıyla çok ciddi ölçüde değişti. Örneğin, bilgisayarların icat edildiği yıllarda programlama, bilgisayarın ön paneli kutlanılarak, ikili (binary) makine komutlarına karşılık gelen düğmelere basmak suretiyle gerçekleştiriliyordu. Programlar birkaç yüz satır uzunluğunda olduğu müddetçe bu yöntem ise yarıyordu. Programlar büyüyünce Assembly dili icat edildi; böylece programcılar, makine komutlarına karşılık gelen sembolik işaretleri kullanarak daha büyük ve artan karmaşıklıktaki programları ele alabileceklerdi. Programlar büyümeye devam ettikçe, programcılara karmaşıklıkla başa çıkabilmek için daha fazla araç sunan FORTRAN ve COBOL gibi yüksek seviyeli diller ortaya çıktı. Bu ilk diller, artık çatlama noktasına geldiğinde yapısal programlama icat edildi.

Şunu bir düşünün: Programlamanın her bir kilometre taşında, programcıların giderek daha da artan karmaşıklıkla başa çıkmalarına imkân veren teknikler ve araçlar geliştirilmiştir. Bu sürecin her adımında yeni yöntem, önceki yöntemlerin en iyi elemanlarını almış ve ilerlemiştir. Bu, nesne yönelimli programlama için de geçerlidir. Nesne yönelimli programlama öncesinde birçok proje, yapısal programlamanın artık işe yaramadığı noktaya yaklaşmıştı (veya aşmıştı). Karmaşıklığı daha iyi ele alabilen bir yöntemlere ihtiyaç vardı ve çözüm, nesne yönelimli programlamaydı.

Nesne yönelimli programlama, yapısal programlamaya özgü en iyi kavramları almış ve bunları bazı yeni kavramlarla birleştirmişti. Sonuçta programlar farklı ve daha iyi şekilde organize edilebilecekti. En genel anlamda, bir program iki yöntemden biri kullanılarak organize edilebilir: kodu etrafında (meydana gelenler) veya verileri etrafında (etkilenenler). Sadece yapısal programlama teknikleri kullanılarak programlar genellikle kod etrafında organize edilir. Bu yöntem ayrıca “veriye etki eden kod” olarak da düşünülebilir.

Nesne yönelimli programlar diğer şekilde çalışırlar. Bu tür programlar “koda erişimi kontrol eden veri” temel prensibine dayanarak veri etrafında organize edilirler. Nesne yönelimli bir dilde, verileri ve bu verilere etki etmeye izin verilen kodu tanımlarsınız. Böylece, bir veri tipi bu veri üzerine uygulanabilecek işlemleri tam olarak tanımlar.

Nesne yönelimli programlamanın prensiplerini desteklemek amacıyla, C# da dâhil olmak üzere tüm nesne yönelimli diller üç ortak özelliğe sahiptir: ilişkili verilerin paketlenmesi (encapsulation), çok biçimlilik (polymorphism) ve kalıtım.

Common Language Runtime Nasıl Çalışır?

Common Language Runtime Nasıl Çalışır?

Bilakis bu, Microsoft Intermediate Language (MSIL) denilen özel bir tipte sözde kod (pseudocode) içeren bir dosyadır. MSIL, spesifik bir CPU‟dan bağımsız olan birtakım taşınabilir komutlar tanımlar. Astında, MSIL taşınabilir bir Assembly dili tanımlar. Diğer bir husus da şudur: MSIL her ne kadar Java’nın bytecode’una benziyor ise de her ikisi aynı değildir.

Program çalıştığı zaman ara kodu çalıştırılabilir bir koda dönüştürmek CLR‟in görevidir. Böylece, MSIL elde edilecek şekilde derlenen her program CLR‟in gerçeklendiği her ortamda çalıştırılabilir. Bu. .NET Framework’ün taşınabilirimi temin etme biçiminin bir parçasıdır.

Microsoft Intermediate Language, bir JIT derleyici kullanılarak çalıştırılabilir bir koda çevrilir, “J1T”, “Just-In-Time”a karşılık gelir (yani, “Tam Zamanında” demektir). Süreç şöyle gelişir: Bir .NET programı çalıştığı zaman CLR, JIT derleyiciyi etkin kılar. JIT derleyici programınızın parçalarının her birine duyulan ihtiyacı temel alarak MSIL’i yerel dile dönüştürür. Böylece, C# programınız başlangıçta MSIL üretecek şekilde derlenmiş olsa bile aslında yerel kod gibi çalışacaktır. Bunun anlamı şudur: Programınız başlangıçta yerel kod üretecek şekilde derlenmiş olsaydı, elde etmiş olacağı çalışma hızına yakın bir hızda çalışacak, üstelik MSIL’in taşınabilirlik avantajlarına da kavuşacaktır.

Bir C# programını derlendiğinizde, MSlL‟e ek olarak elde edilen bir diğer şey de metadata olarak adlandırılan çıktıdır. Metadata, programınızın kullandığı verileri tarif eder ve kodunuzun diğer kodlarla etkileşmesini mümkün kılar. Metadata, MSIL ile aynı dosya içinde yer alır.

.NET Framework Nedir?

.NET Framework Nedir?

.NET Framework, çok dağıtık (highly-distributed), bileşen yönelimli uygulamaların geliştirilmesini ve yürütülmesini destekleyen bir ortam tanımlamaktadır. .NET Framework, farklılık gösteren bilgisayar dillerinin birlikte çalışmasını mümkün kılar ve Windows platformu için güvenlik, taşınabilirlik (programlar açısından) ve ortak bir programlama modeli sağlar. .NET Framework‟ün doğası gereği yalnızca Windows ile sınırlı olmadığını (gerçi bugün için mevcut tek ortam bu olmasına rağmen) belirtmemiz gereklidir. Bunun anlamı şudur: .NET

Framework için yazılmış programlar gelecekte Windows olmayan ortamlara da taşınabilecektir.

.NET Framework C# ile ilişkili olduğu için iki çok önemli unsuru tanımlamaktadır. Bunlardan ilki Common Language Runtime‟dır (CLR – Ortak Dil Çalışma Zamanı) Bu, programınızın çalışmasını idare eden sistemdir. Diğer avantajlarının yanı sıra CLR, .NET Framework‟ün programların taşınabilirliğini mümkün kılan, karışık dilde programlamayı destekleyen ve güvenliği sağlayan bir parçasıdır.

İkinci unsur ise .NET sınıf kütüphanesidir. Bu kütüphane, programınızın çalıştırma ortamına erişmesine imkân verir. Örneğin, ekranda bir şey göstermek gibi bir I/O (Giriş/Çıkış) işlemi gerçekleştirmek istiyorsanız, bunun için .NET sınıf kütüphanesini kullanacaksınız. Şayet programlamayı yeni öğreniyorsanız, sınıf terimi size yeni gelebilir. Bu terim kitabın daha sonraki bölümlerinde ayrıntılı açıklanıyor olmakla birlikte, şimdilik kısa bir tanım yeterli olacaktır: Sınıf, programları organize etmeye yarayan nesne yönelimli bir özelliktir. Bir program .NET sınıf kütüphanesinde tanımlanan özelliklerle kısıtlı kalırsa,    .NET çalışma zamanı sisteminin desteklendiği her yerde çalıştırılabilir. C# otomatik olarak .NET sınıf kütüphanesini kullandığı için, C# programları .NET ortamlarının tümüne otomatik olarak taşınabilir.

C# Aile Ağacı

C# Aile Ağacı

Bilgisayar dilleri boşlukta asılı değildir. Aslında, bilgisayar dilleri birbirleriyle bağlantılıdır; her yeni dil, kendisinden önceki dillerden bir şekilde etkilenmiştir. Farklı bitki türlerinin, birbirlerinin polenlerini kullanarak yeni bitki türleri oluşturması gibi bir durum söz konusudur. Benzer şekilde, bir dilin özellikleri bir diğerine uyarlanmış, varolan bir dile bir yenilik eklenmiş veya eski bir özellik varolandan çıkarılmıştır, Bu şekilde diller gelişmekte ve programlama sanatı ilerlemekledir. C# da bu bağlamda bir istisna değildir.

C# zengin bir programlama mirasına sahiptir. C# direkt olarak dünyanın en başarılı programlama dillerinin ikisinden türetilmiştir: C ve C++ . Ayrıca bir başkasıyla da yakından ilişkilidir, Java. Bu ilişkilerin doğasını anlamak, C#‟ı anlamak için kritik öneme sahiptir. Bu nedenle, C#‟ı bu üç dilin tarihi çerçevesine oturtarak incelemeye başlıyoruz.

Modern Programlama Çağının Başlangıcı

C‟nin ortaya çıkışı programlamanın modern çağının başlangıcına işaret eder. C, Dennis Ritchie tarafından 1970‟te, UNIX işletim sistemi kullanan DEC PDP-11 üzerinde icat edildi.

Daha önceki bazı diller, özellikle Pascal, kayda değer bir başarı elde etmiş olsa da, bugünkü programlamanın gidişatını belirleyen modeli kuran C olmuştur,

C, 1960‟ların yapısal programlama (structured programming) devrimi ile ortaya çıktı.

Yapısal programlama öncesinde büyük programları yazmak zordu, çünkü program mantığı “spagetti kod” olarak bilinen, takibi güç, bir takım arapsaçına dönmüş atlamalar, çağrılar ve dönüşlerden ibaret olan bir program yapısına dönüşme eğilimindeydi. Yapısal dillerin bu probleme getirdiği çare; düzgün tanımlanmış kontrol ifadeleri, yerel değişkenli alt rutinler (subroutines) ve diğer gelişmiş özelliklerdir. Yapısal dilleri kullanarak bir dereceye kadar büyük programları yazmak mümkün hale geldi.

O zamanlar başka yapısal diller de mevcut olmasına rağmen gücü, estetiği ve ifade edilebilirliği başarıyla birleştiren ilk dil C oldu. C‟nin kısa ve öz ama aynı zamanda kullanımı kolay söz dizimi, kontrolün (dilde değil de) programcıda olmasına dayanan felsefesiyle birleşince çok kısa bir sürede birçok kişinin diğer dilleri bırakıp C‟ye dönmesiyle sonuçlandı. Bugünün bakış açısıyla anlaşılması biraz güç olabilir ama C, programcıların uzun zamandır beklediği taze bir soluktu. Sonuç olarak; C, 1980’lerin en yaygın olarak kullanılan yapısal programlama dili halini aldı.

Her şeye rağmen, saygın C dilinin bile kısıtlayıcı yönleri vardı. En zahmetli yönlerinden biri büyük programları ele almadaki yetersizliğiydi. Proje belirli bir boyuta ulaştığı zaman C dili adeta bir engele çarpar ve bu noktadan sonra C programları anlaşılması ve sürdürülmesi zor bir hal alır. Bu limite tam olarak ne zaman ulaşılacağı programa, programcıya ve eldeki araçlara bağlı olmakla birlikte 5,000 satır gibi kısa bir kodda bile bu durumla karşılaşılabilmektedir.

Nesne Yönelimli Programlamanın ve C++’ın Doğuşu

1970’lerin sonlarına doğru birçok projenin boyutu, yapısal programlama yöntembilimlerinin ve C dilinin başa çıkabileceği sınırlara ya yaklaşmıştı ya da ulaşmıştı. Bu problemi çözmek amacıyla nesne yönelimli programlama (OOP – Object Oriented Programming) denilen yeni bir programlama yöntemi ortaya çıkmaya başladı. Nesne yönelimli programlamayı kullanarak, bir programcı çok daha büyük programların üstesinden gelebilecekti. Sorun, o zamanlar en popüler dil olan C‟nin nesne yönelimli programlamayı desteklememesiydi. C‟nin nesne yönelimli bir versiyonu için duyulan istek en sonunda C++„ın ortaya çıkmasına neden oldu.

C++, Bjarne Stroustrup tarafından Murray Hill, New Jersey‟deki Bell Laboratuarlarında

I979‟da icat edilmeye başlandı. Stroustrup, bu yeni dili ilk önce “C with Classes” (“Sınıflı C”) olarak adlandırdı. Ancak, 1983’te dilin ismi C++ olarak değiştirildi. C++ , C dilinin bütününü içermektedir. Bu nedenle C, C++‟ın üzerine inşa edildiği bir temeldir. Stroustrup’un C üzerine yaptığı değişikliklerin pek çoğu, nesne yönelimli programlamayı desteklemek amacıyla tasarlanmıştı. Yeni dili C temeli üzerine inşa ederek Stroustrup, nesne yönelimli programlamaya yumuşak bir geçiş sağlamıştır. Bir C programcısının nesne yönelimli yöntembilimin avantajlarından yararlanmadan önce, bütünüyle yeni bir dil öğrenmek zorunda kalmak yerine, sadece bir-iki yeni özellik öğrenmesi gerekecekti.

C++ 1980‟lerin büyük bölümünü, arka planda, kapsamlı bir gelişme kaydederek geçirdi. 1990’ların başından itibaren C++ genel kullanım için hazırdı; üstelik, popülaritesi de adeta patlama yapmıştı. On yıllık sürecin sonuna gelindiğinde C++ en yaygın olarak kullanılan programlama dili halini almıştı. Bugün halen, yüksek performanslı, sistem seviyesinde kod geliştirmek için C++ üstün bir dildir.

C++‟ın keşfinin bir programlama dili ortaya çıkarmaya yönelik bir girişim olmadığını anlamak kritik öneme sahiptir. Bilakis, C++ zaten çok başarılı bir dilin geliştirilmiş haliydi. Dillerin gelişimi ile ilgili bu yaklaşım – mevcut bir dil ile başlayıp, onu daha da ileriye taşımak – bugün bile devam etmekte olan bir trendin öncüsü oldu.

İnternet ve Java’nın Gelişi

Programlama dillerindeki bir sonraki başlıca ilerleme Java ile gerçekleştirilmiştir. Önceleri Oak olarak adlandırılan Java ile ilgili çalışmalar I99l‟de Sun Microsystems‟da başladı. Java’nın tasarımının arkasında yer alan esas sürücü güç James Gosling’di. Patrick Naughton, Chris Warth, Ed Frank ve Mike Sheridan‟ın da Java üzerinde ayrıca rolü oldu.

Java, söz dizimi ve felsefesi C++‟tan alınan yapısal ve nesne yönelimli bir dildir. Java‟nın yenilikçi özellikleri, programlama sanatındaki ilerlemelerden çok fazla etkilenmedi (gerçi bu ilerlemelerin bir kısmının kuşkusuz etkisi olmuştur); bu özellikleri daha ziyade bilişim ortamında yaşanan değişiklikler biçimlendirdi. İnternet’in genel kullanıma açılması öncesinde, programların birçoğu belirli bir CPU ve belirli bir işletim sistemi için yazılıyor, derleniyor ve yönlendiriliyordu. Programcıların kodlarını yeniden kullanmayı sevdikleri her zaman için geçerli bir durum olsa da, bir programı kolaylıkla bir ortamdan diğerine aktarma becerisi halen erişilmesi gereken bir özellikti ve taşınabilirlik (portability), diğer acil problemlerin yanında, ancak arka koltukta yer bulabiliyordu. Ancak, birçok farklı tipte CPU‟nun ve işletim sisteminin birleştirildiği İnternet’in çıkışıyla birlikte, eski taşınabilirlik problemi de yeniden gündeme geldi. Taşınabilirlik problemini çözmek için yeni bir dile ihtiyaç vardı. İşte bu yeni dil Java’ydı.

Java’nın tek önemli özelliği (ayrıca, hızla kabul görmesinin de nedeni), platformlar arasında taşınabilir kod geliştirme becerisi olmasına rağmen Java’yı teşvik eden asıl enerjinin İnternet olmadığını kaydetmek enteresandır. Asıl teşvik, gömülü denetleyiciler (embedded controllers) için yazılım geliştirmek amacıyla kullanılabilecek platformdan bağımsız bir dile (cross-platform language) olan ihtiyaçtır. 1993’te, gömülü denetleyiciler için kod geliştirirken ortaya çıkan platformlar arasında taşınabilirliği ile ilgili hususlarla İnternet için kod geliştirmeye çalışırken de karşılaşıldığı arlık netleşmişti. Hatırlayınız: İnternet, birçok farklı tipte bilgisayarın yaşadığı çok geniş, dağıtık bir bilişim evrenidir. Taşınabilirlik problemini küçük ölçekte çözen tekniklerin aynıları, büyük ölçekte İnternet’e de uygulanabilir.

Java, programın kaynak kodunu bytecode denilen bir ara dile dönüştürerek taşınabilirliği sağlıyordu. Bu “bytecode” daha sonra Java Sanal Makinesi (Java Virtual Machine – JVM) tarafından çalıştırılıyordu. Bu nedenle, bir Java kodu JVM‟in mevcut olduğu her ortamda çalıştırılabilecekti. Ayrıca, JVM‟i uygulamak nispeten kolay olduğu için JVM çok sayıda ortamda kolayca kullanılabiliyordu.

Java‟nın “bytecode” kullanımı hem C‟ye hem de C++‟a göre kökten farklılık gösteriyordu.

C ve C++ derlendiğinde hemen hemen her zaman çalıştırılabilir makine kodu elde ediliyordu. Makine kodu ise belirli bir CPU ve işletim sistemine sıkı sıkıya bağlıdır. Yani, bir C/C++ programını farklı bir sistemde çalıştırmak istemişseniz, programın yeniden derlenmesi ve bu ortam için spesifik olarak makine kodunun üretilmesi gerekecekti. Bu nedenle, çok çeşitli ortamlarda çalışacak bir C/C++ programı geliştirmek için programın birkaç farklı çalıştırılabilir versiyonuna ihtiyaç vardı. Bu pratik olmadığı gibi aynı zamanda maliyetliydi de. Java’nın ara dil kullanımı zarif ve maliyet açısından hesaplı bir çözümdü. Aynca bu, C#‟ın kendi amaçları doğrultusunda adapte edeceği bir çözümdü.

Önceden bahsedildiği gibi, Java; C ve C++‟ın soyundan gelmektedir. Söz dizimi C‟yi temel alır; nesne modeli ise C++‟tan geliştirilmiştir. Java kodu ne ileri ne de geri yönde C veya C++ ile uyumlu olmasa da, Java’nın söz dizimi yeteri kadar benzer olduğu için, çok sayıda programcıdan oluşan mevcut C/C++ programcıları ekibi çok az bir çaba ile Java‟ya kayabileceklerdi. Üstelik Java mevcut bir yöntemin üzerine inşa edilmiş ve geliştirilmiş olduğu için Gosling ve arkadaşları yeni ve yenilikçi özelliklere odaklanmakta serbesttiler. Tıpkı Stroustrup‟un C++‟ı geliştirirken “tekerleği yeniden icat etmesine” gerek olmadığı gibi, Gosling’in de Java‟yı geliştirirken bütünüyle yeni bir dil icat etmesi gerekmiyordu. İlaveten, Java‟nın ortaya çıkışıyla C ve C++ yeni bilgisayar dillerinin üzerine inşa edileceği onaylanmış bir katman olmuş oluyordu.

C#’ın Doğuşu

Java, İnternet ortamında taşınabilirliği çevreleyen birçok hususu başarıyla ortaya koymuş olmasına rağmen, Java‟nın da yetersiz kaldığı bazı özellikler hala mevcuttur. Bunlardan biri, “diller arasında uyum içinde çalışma” (cross-language interoperability) olarak tarif edilebilecek özelliğidir Buna ayrıca, karışık dillerde programlama (mixed-language programming) da denir. Bu, bir dilde üretilmiş bir kodun bir başka dilde üretilmiş kodla birlikte kolaylıkla çalışma becerisidir. Diller arasında uyum içinde çalışma özelliği büyük, dağıtık yazılım sistemleri geliştirirken gereklidir. Bu, ayrıca programlama yazılım bileşenleri için de istenilen bir özelliktir. Çünkü en kıymetli bileşen; en çok sayıda işletim ortamında, en çeşitli bilgisayar dilli yelpazesinde kullanılabilen bileşendir.

Java’nın yoksun olduğu bir diğer özellik ise Windows platformlarıyla tam entegrasyondur. Java programları (Java Sanal Makinesinin kurulmuş olduğunu varsayarak) Windows ortamında çalıştırılabilir olmalarına rağmen, Java ve Windows yakından ilişkili değildir. Windows dünyada en yaygın olarak kullanılan işletim sistemi olduğundan, Windows için doğrudan destekten yoksun olması, Java için bir dezavantajdır.

Bu ve diğer ihtiyaçlara cevap vermek amacıyla Microsoft, C#‟ı geliştirdi. C#, 1990‟ların sonlarına doğru Microsoft‟ta ortaya çıktı ve Microsoft‟un .NET stratejisinin bütününün bir parçası oldu. C# ilk kez 2000‟in ortalarında alfa versiyonu olarak piyasaya çıktı. C#‟ın baş mimarı, çeşitli büyük başarılara imza atmış bulunan, dünyanın önde gelen dil uzmanlarından Anders Hejlsberg‟dir. Örneğin, Hejlsberg 1980’lerde çok başarılı ve güçlü bir dil olan Turbo Pascal‟ın orijinal yazarıdır. Turbo Pascal‟ın sadeleştirilmiş uygulaması, geleceğin tüm derleyicileri için standartları belirlemişti.

 

C#; C, C++ ve Java ile doğrudan bağlantılıdır. Bu tesadüf değildir. Bunlar, dünyada en yaygın olarak kullanılan – ve en fazla sevilen – programlama dillerinden üçüdür. Üstelik bugün profesyonel programcıların neredeyse tamamı C ve C++‟ı, birçoğu da Java’yı bilmektedir. C#‟ı sağlam ve iyi anlaşılır bir temel üzerine inşa ederek bu dillerden C#‟a kolay bir geçiş de sağlanmış oldu. Hejlsberg için “tekerleği yeniden icat etmek” ne gerekli ne de istenilir bir durum olmadığı için, kendisi belirli gelişmelere ve yeniliklere odaklanmakta serbestti.

C#‟ın aile ağacı Şekil 1.1‟de gösterilmektedir. C#‟ın dedesi C‟dir. C‟den C# söz dizimini, anahtar kelimelerinin birçoğunu ve operatörlerini almıştır. C#, C++ ile tanımlanan nesne modeli üzerine kurulmuştur ve bu nesne modelini geliştirmiştir. C veya C++‟ı biliyorsanız C# ile adeta kendinizi evinizde hissedeceksiniz.

C# ve Java arasındaki ilişki biraz daha karmaşıktır. Daha önce açıklandığı gibi, Java da C ve C++ ‘tan türemiştir. Java da C/C++ söz dizimini ve nesne modelini paylaşmaktadır. Tıpkı Java gibi, C# da taşınabilir kod üretmek amacıyla tasarlanmıştır. Ancak C#, Java‟dan türememiştir. Aksine, C# ve Java ortak bir soyu paylaşan, fakat birçok önemli açıdan farklılık gösteren birer kuzen gibidir. Her şeye rağmen, bunun iyi bir tarafı da vardır: Eğer Java‟yı biliyorsanız birçok C# kavramı size tanıdık gelecektir. Aksi de doğrudur: Şayet gelecekte Java öğrenmeniz gerekli olursa, C# ile öğrendiğiniz birçok şey Java’da da geçerli olacaktır.

Bu kitabın konuları içinde uzun uzadıya inceleyeceğimiz C#‟ın pek çok yeni özelliği mevcuttur. Ancak C#‟ın en önemli özelliklerinden bir kısmı, standart olarak mevcut olan ve yazılım bileşenleri için sunulan destek ile bağlantılıdır. Aslında, C# bileşen yönelimli bir dil (component-oriented language) olarak nitelenmektedir; çünkü C#, yazılım bileşenlerini yazmak için bütünleşik destek içermektedir.

Örneğin C#, bileşenleri oluşturan öğeleri, mesela özellikleri, metotları ve olayları doğrudan destekleyen özellikler içerir. Ancak, C#‟ın karışık dillerin hâkim olduğu bir ortamda çalışabilme becerisi belki de C#‟ın bileşen yönelimli özelliklerinden en önemlisidir.

C# ile .NET Framework Arasındaki Bağlantı

C# kendi başına incelenebilecek bir bilgisayar dili olmasına rağmen C#‟ın çalıştırma ortamı (runtime environment) ile, yani .NET Framework ile özel bir ilişkisi vardır. Bunun iki sebebi vardır. Birincisi, C# başlangıçta Microsoft tarafından .NET Framework için kod geliştirmek amacıyla tasarlanmıştı. İkincisi, C# tarafından kullanılan kütüphaneler, .NET

Framework tarafından tanımlanan kütüphanelerdi. Yani, C# dilini .NET ortamından ayırmak mümkün olsa dahi her ikisi birbiriyle sıkı sıkıya bağlıdır. Bu nedenle, .NET Framework’ü genel olarak anlamak ve bunun C# için önemini kavramak gereklidir.

 

 

Kontrol Altına Alınan ve Alınmayan Kodlar

Genel olarak, bir C# programı yazdığınızda kontrol altına alınan kod (managed code) denilen bir kod geliştirirsiniz. Kontrol altına alınan kod, Common Language Runtime’ın kontrolünde az önce anlatılan şekilde çalıştırılır. Kontrol altına alınan kod CLR‟in kontrolünde çalıştığı için, belirli kısıtlamalara tabidir – bunun yanında, bazı avantajlar da elde eder. Kısıtlamalar kolaylıkla tarif edilir ve karşılanır: Derleyici, CLR‟a yönelik bir MSIL dosyası üretmelidir (C# bunu gerçekleştirir) ve .NET Framework kütüphanelerini kullanmalıdır (C# bunu da gerçekleştirir). Kontrol altına alınan kodun avantajları pek çoktur. Modern bellek yönetimi, dilleri karıştırma becerisi, daha sıkı güvenlik, sürüm kontrol desteği ve etkileşecek yazılım bileşenleri için net bir yöntem, bu avantajlar arasında yer alır.

Kontrol altına alınan kodun tam tersi ise kontrol altına alınmayan koddur (unmanaged code). Kontrol altına alınmayan kod, Common Language Runtime allında çalışmaz. Yani, .NET Framework‟ün geliştirilmesi öncesinde yer alan Windows programlarının tümü kontrol altına alınmayan kod kullanırlar. Kontrol allına alınan ve alınmayan kodların bir arada çalışması mümkündür; böylece C#‟ın kontrol altına alınabilir kod ürettiği gerçeği, C#‟ın önceden mevcut programlarla birlikte çalışabilme becerisini kısıtlamaz.

Common Language Specification

Kontrol altına alınan kodların tümü CLR ile sağlanan avantajlardan yararlanıyor olsa da, şayet kodunuz farklı dillerde yazılmış programlar tarafından kullanılacaksa, kullanılabilirliği en üst seviyeye çıkarmak için kodunuzun Common Language Specification‟a (CLS – Ortak Dil Spesifikasyonu) sıkı sıkıya yapışması gereklidir. CLS, farklı dillerde ortak olan özellikleri tarif eder. CLS uyumu, diğer diller tarafından kullanılacak yazılım bileşenleri geliştirirken özellikle önemlidir. CLS, Common Type System‟in (CTS – Ortak Tip Sistemi) bir altkümesini içerir. CTS, veri tiplerini ilgilendiren kuralları tarif eder. Elbette, C# hem CLS‟i hem de CTS‟i desteklemektedir.