
Python Programlama – Giriş
Ocak 2, 2022
C# Programlama – Değişkenler ve Veri Türleri
Ocak 2, 2022C# Programlama - Giriş
C# dili Microsoft tarafından .NET için geliştirilen C ve C++ dillerinden türetilen nesneye dayalı modern bir dildir. ECMA ve ISO standartları altındadır. Java' ya benzer bir yapıdadır. C# dili RAD yani Rapid Application Development (Hızlı uygulama geliştirme aracı) olduğu programcılar tarafından bilinir. Öncelikle C#' ı bilgisayarımıza kurup verilen bilgi ve örnekleri uygulayıp anlamakta fayda var.
C# Kurulumu:
C#' ı bilgisayarımızda çalıştırmak için .NET Framework' ün önerilen en son sürümünün yüklü olması yeterlidir.
.NET Framework Yükleme Linki: https://dotnet.microsoft.com/en-us/download/dotnet-framework
C# IDE Kurulumu:
C# dili ile kodları yazmak ve çalıştırmak için kullanabileceğimiz en iyi IDE' ler:
1- VS Code,
2- Visual Studio,
3- Rider,
4- NotePad++,
5- Atom,
6- DevExpress,
7- Eclipse aCute
8- SlickEdit
Ben C#' ı anlatırken Visual Studio' yu kullanacağım. Visual Studio için para ödemenize gerek yok. Ücretsiz olan communitiy sürümünü kullanabilirsiniz.
Visual Studio yükleme linki : https://visualstudio.microsoft.com/tr/
Başlarken;
C# ve diğer dillerde kod yazılıp çalıştırılması aşamasına kadar geçen bir evre vardır. Bu evreler sırasıyla; program yazma, derleme ve makine diline dönüştürme olarak bilinir.
C# Kodları Arka Planda Sistem Tarafından Nasıl Çalıştırılır?
C#' ta yazdığımız kodlar direk makine koduna çevrilmez. .NET Compiler ile program kodu derlendikten sonra Microsoft tarafından oluşturulan CIL (Common Intermediate Language(ara dil))' e çevrilir. Oluşturulan CIL kodu CLR(Common Language Runtime - Ortak Dil Çalışma Zamanı) yardımı ile çalıştırır. Bundan sonra çalıştırılan CIL kodu JIT (Just In Time Compiler) ile derlenerek makine kodu elde edilir.
.NET içeriğinde bulundurduğu dillerin hepsinin bir arada çalışmasına izin veriyor.
Aşağıdaki görselde .NET içerisinde bulunan dillerin hepsini bir projede kullanarak nasıl derlendiğinin cevabını bulabilirsiniz.

CLR (Common Language Runtime - Ortak Dil Çalışma Zamanı) Nedir?
CLR yani Common Language Runtime .NET Framework te bulunan diller(VNet, C#, Visual C++, Jscript ve diğer diller) ile yazılan programların çalışmasını sağlayan ve Güvenlik, işlemci thread kullanımı, kod yönetimi, bellek kullanımı, CTS, CLS, CIL denetimlerini yapan bir ara çalıştırma katmanıdır.
CLS (Common Language Specification - Ortak Dil Spesifikasyonu) Nedir?
.NET içeriğinde bulunan dillerin ortak yapılarının olduğu ve bu yapıların kontrolünü sağlayan bölümdür.
NET' te bulunan bir çok dil bu yapıyla uyumludur.

CTS (Common Type System - Ortak Tip Sistemi) Nedir?
.NET Framework'te Tip tanım ve değerlerinin nasıl temsil edildiğini belirleyen standarttır. Farklı bir programlama dilinde yazılan bir değeri bir başka programın değer olarak anlayabilmesi amacıyla sistemin bir parçasıdır. CTS diğer türlerin türediği temel bir tür olan System.Object ile tek tabanlı bir nesne hiyerarşisi olarak tasarlandı.
CTS Değer ve Referans olmak üzere 2 türü destekliyor. Aşağıdaki görselde detaylı bir şekilde ifade edilmiştir.

Not: .NET' te genel olarak oluşturduğumuz bütün exe ve dll dosyalarına assembly (Burada makine dili olan assembly' den bahsedilmiyor.) denir. Assembly kavramının Application Domain özelliği sayesinde aynı anda yapılan birçok işleme rağmen çökme, donma yada kasmanın olmamasıdır.
İlk Örnek Kod:
class newProgram {
// static int myBirthDay = 33;
static void Main() {
int myBirthDay = 33;
Console.WriteLine("Merhaba Türkiye !");
}
}
Not: C#'ta kodlar bir main() fonksiyonu ile çalışır.
Not: Değişkenler tanımlandıkları yerlere göre bir geçerlik bölgesi (scope) vardır. Örneğin yukarıdaki örnekte myBirthDay değişkenini main fonksiyonunun üstündeki satıra koysaydık WriteLine metodu ile o değişkene ulaşamayacaktık. Dolayısıyla hata mesajı alacaktık. Eğer değişkenin başına Static ön ekini getirseydik ("static int myBirthDay") hata mesajı almadan değişkene ulaşabilip ekrana yazdırabilir dik. Metodun değişkene ulaşması için değişkenin adresini gösteren bir referans olmalı.
Not: C#'ta yazdığımız kodlara "deyim" diyoruz. C#' ta önemli olan bir kuralda yazdığımız kodların yani deyimlerin sonuna noktalı virgül koyarız. Eğer koymaz isek derleyici "expected ; " uyarısı verir. Derlemeyi durdurup ";" eklersek program sorunsuz derlenir. Bu düzeltme işlemine programlamada "debug" işlemi diyoruz.
Not: Diğer bir dikkat edilen konuda C# ta fonksiyonlara daha genel kabul edilebilir bir isim olarak metodlar denilir.
Yorum Satırları: Yorum satırları yazdığımız kodlara bir açıklama yada tanım eklenmesi için kullanılır. Çoklu satır ve Tekli satır olmak üzere 2 çeşittir.
Tek Satır Yorum Satırı:
// Açıklama Burada
Çoklu Yorum Satırı:
/*
Açıklama Burada
Açıklama Burada
*/
Namespace ve .NET Sınıf Kütüphanesi:
.NET kütüphanesinde geliştiriciler için hazır sınıf ve tür kütüphaneleri vardır. Bunlar using keyword(anahtar sözcüğü) ile namespace kullanılarak bu sınıf ve türlerini tarayıcıya bildiririz. C#'ta metod ve değişkenlerin hepsi birer sınıf içerisindedir. Birbiriyle ilişkili olan sınıfların bir grupta toplanması sayesinde erişimi çok kolaydır. Bu grupların her birine namespace (Türkçesi ad-uzayı yada ad-alanı) diyoruz. Bir namespace içinde aynı isme sahip 2 tane sınıf olmaz ama 2 farklı isme sahip namespace arasında aynı adları taşıyan sınıflar olabilir.
Kullanımı:
using system;
using system.IO;
Not: Kendi isim alanımızı oluştururken kullanım kolaylığı olması açısından Microsoft' un belirlediği isim alanını örnek almalıyız. Örneğin; Data sınıfı System sınıfının bir alt öğesi dir. Yani bizde bir Namespace tanımlayıp alt sınıflarını oluştururken bir hiyerarşi şeklinde nokta(.) ile bir alt sınıfa erişimi sağlamalıyız. Bu şekilde kodlarımız bir düzen içinde kullanılır ve karışıklık ortadan kalkar. Örneğin: deneme.denemeOrnegi
Not : .NET Framework'te en yaygın olarak "system" sınıfı kullanılır. .NET Framework' te bulunan temel sınıflar "system" sınıfında bulunur. Bu sınıfın altında data, math, xml, net ve IO vs. sınıfları bulunur. Bu alt sınıflarında alt sınıfları vardır. Örneğin; data sınıfında bulunan alt sınıflar; common, OleDb, SqlClient ve SqlTypes' dır. (Kullanım : using system.data.common)
Girdi Çıktı Metodları (Console Metodları(Fonksiyonları)):
Console.Write(); --> Çıktı gönderir(Yani ekrana yazar.).
Console.WriteLine(); --> Çıktı gönderir(Yani ekrana yazar.). Write metodundan tek farkı gönderdikten sonra satır başı yapar. (\r\n)
Console.Read(); --> Okuma yapar. Kullanıcının klavyeden girdiği ilk karakteri okur. Birden çok read() metodu kullanılırsa klavyeden girilen karakter sayısına bağlı olarak sıradan okur.
Console.ReadLine(); --> Okuma yapar. Kullanıcının klavyeden bir satıra girdiği bütün karakterleri okur. Read metodunda da olduğu gibi birden fazla kullanılırsa satır sırasına göre okuma yapar. Burada dikkat etmemiz gereken önemli mesele verileri string yani metinsel olarak okumasıdır. Bu verileri sayısal anlamda kullanamak istersek parse() metodu ile metinsel veriden sayısala dönüşüm yapmalıyız. Read() metodu ise verileri karakter olarak okuduğundan parse() işlemine gerek duymaz.
parse(); Metodu:
parse metodu metinsel veriyi sayısal veri tipine dönüştürür. İlerleyen makalelerde detaylı olarak bu konulara değinilecek.
Tip dönüşümlerini detaylı olarak incelemek için tip dönüşümleri makalesini okuyabilirsiniz.
Örneğin:
int sayısalVeri; // integer olarak sayısalVeri değişkenini tanımladık.
string metinselVeri; // string olarak metinselVeri değişkenini tanımladık.
// ReadLine metodu ile kullanıcının klavyeden yazdığı veriyi okuyup, string olarak tanımladığımız metinselVeri değişkenine atadık. Daha sonra integer tipinde tanımladığımız sayısalVeri değişkenine parse işlemi ile sayısal veriye çevirdiğimiz veriyi atadık.
metinselVeri = Console.Readline(metinselVeri);
sayısalVeri = int.Parse(metinselVeri );
// Kullanıcının klavyeden girdiği veriyi ReadLine metodu ile string olarak alıp direk parse edelim.
sayısalVeri = int.Parse(Console.ReadLine() );
C#'ta Parametre:
Matematik'te fonksiyonlar dersinde gördüğümüz "f(a)" fonksiyonunda kullandığımız "a" değeri bir parametredir. Program yazarken de parametreyi bu mantıkla kullanacağız.
C#'ta Bellek Kullanımı:
Veriler bellekte 6 ayrı bölgede birden tutulur. Bunlar; Register, Static, Constant, Ram olmayan, Stack ve Heap bölgedir. Kodlayarak yazdığımız programlardaki veriler ram bellekte Stack ve Heap adlı bölgede tutulur.
Register: Çok kısıtlı olan ve en hızlı erişilen bellek bölgeleridir. CPU(Merkezi işlem birimi) mimarisine göre değişiklik gösterirler. Buradaki işlemler tamamen derleyici tarafından yönetilir. Registerlar sınırlı sayıda olduğundan dolayı derleyiciler çok sık işlem yaptığı verileri hızdan kazanmak için registerlar da tutarlar.
Static: Adındanda anlaşılacağı gibi bellekte sabit bir bölgeyi temsil eder. Bu bölgede tutulan veriler program açık kaldığı sürece yani çalıştığı bütün süre zarfında bellekte tutulur. Program içinde bir veriyi sabit olarak belirtmek için static keyword' ü (anahtar sözcüğü) kullanılır.
Not: Hiç bir nesneye referans olmadan kullanılabilen öğeler static olarak bilinir. main() metodu bu olaya en büyük örnektir. Herhangi bir nesne oluşturulmadan önce öncelik olarak ilk başta yazılması gerektiğinden dolayı static' tir.
Örneğin : Bir sınıf içinde bulunan metodu satatic olarak tanımlayalım;
class Toplama
{
public static int Toplama(int a, int b)
{
int c = a + b;
return c;
}
}
Costant(Sabit) Bölgesi: Constant(sabit) değişmesi mümkün olmayan ve sadece okunabilen değerlerdir. Bu veriler kodlarda gömülü şekildedirler. Rom (Read only memory) bölgesi de sadece okuma amaçlı kullanıldığı için bu değerler hızlı erişim için bu bölgede de tutulabilirler.
Ram olmayan bölge - Swap Space(Takas alanı): Ram' da tutulan verilerin dışında kalan bölgedir. Yazdığımız programın çalışmadığı durumlarda veriye erişmek yada Ram belleğin boyutunun yetmediği durumlarda derleyici Harddisk' in bir bölümünü yardımcı bellek olarak kullanarak veriye erişimi sağlamak amacıyla kullanılır. Derleyici'nin yönettiği bu alana Swap Space(Takas alanı) denir. Bu gibi işlemler için genelde Harddisk, Flash disk yada Flopy disk vb. diskler kullanılır.
Stack Bölgesi: Ram bellekte en hızlı erişimin olduğu bölgedir. LIFO (Last Input First Output) yani son giren ilk çıkar mantığı ile çalışan yapıdır. Bir rafta üst üste konulan veri kutularını düşünürsek yeni gelen kutu en üste konur ve alınan kutu yine üstten alınır. Stack bir sınıftır. C#'ta bütün değer tipleri (value type) Stack bölgesinde tutulur.
Heap Bölgesi: C#'taki bulunan reference(referans) tiplerinin tutulduğu bellek bölgesidir. Dolayısıyla nesnelerin de tutulduğu bölgedir. Bir Sınıfa ait nesne oluşturulunca heap bölgesinde nesneye ait bütün öğeleri içeren bir alan oluşturulur. Bu kısım aynı zamanda nesnenin adresidir. Bu adres bu nesneyi işaret eden referans(işaretçi(resimde bulunan oklar) yada pointer) tarafından bilinir. Aşağıdaki şekilde bu kısma detaylı bir şekilde bakalım.

Not: Heap bölgesinde veriye erişim stack bölgesine göre çok zordur çünkü veriler karışık bir şekilde tutulur.
Not: Value type(Değer tipleri) veriyi tutan değişken türleridir. Reference Type(Referans tipleri) ise veri yerine verinin bellekteki adresini tutan değişken türleridir.

Garbage Collector (Çöp Toplayıcı):
C#' ta oluşturulan nesneler {süslü parantez} blokunun içinde kullanımı sonlandıktan sonra ana bellekten silinip heap bölgesine taşınır. Bu işlemi gerçekleştiren Garbage Collector' dur. C #'ta arka planda otomatik olarak çalışır. C#'ta Garbage Collector'e gerektiği zaman geliştiriciler manuel olarak müdahale edebilir. C++ gibi bazı programlama dillerinde bu işlem C#'ta kinin aksine manuel olarak geliştiricinin silmesi ile yapılır.
Örneğin bir nesne oluşturalım:
string strOne = new string("Merhaba Dünya"); // Bir nesne oluşturduk. Bu nesneyi işaret eden referans strOne' dır.
Merhaba dünya ana bellekte bir adrese tanımlanır. Bu adresi işaret eden referansı strOne' dır. Kod bloğu içinde işlem tamamlanıp {süslü parantez} dışına yani blokun dışına çıkınca referans strOne yok olur. Ama oluşturulan nesne "merhaba dünya" ana bellekte kalır. Garbage collector bellekte işleri biten işaret edilmeden kalan nesneleri çöpe atar. Yani bellek adresleri boşaltılıp heap bölgesine ekler.