.NET Dünyasına Giriş (C#)

Merhaba arkadaşlar, Sizlerle bilgilerimi paylaşmak için hazırladığım “.Net Dünyasına Giriş” makalem 5 seriden oluşmaktadır. Bu dört makalede sizler için .Net dünyasının temel yapı taşlarını anlatmaya çalışacağım. Bu dört seri aşağıdaki başlıklardan oluşmaktadır.

  1. .Net Dünyasına Giriş – C# (.Net Giriş, Değişkenler, Kontrol Yapıları, Döngüler, Dizi, Method, Sınıf)
  2. Veritabanı Programlama – MS SQL (T-SQL, Temel Veri İşlemleri)
  3. Veriye Erişim – ADO.NET (Veriye Erişim, .Net Veri Sağlayıcısı, Bağlantılı ve Bağlantısız Modeller)
  4. Windows Uygulamaları – C# (Windows Uygulamalar, Windows Kontrolleri)
  5. Web Uygulamaları – ASP.NET (Web Uygulamaları, Web Kontrolleri, Veri İşlemleri, Durum Yönetimi)

.Net platformu, Microsoft tarafından geliştirilen ve platformdan bağımsız bir şekilde uygulama geliştirilmesine olanak sağlayan bir ortamdır. Bilinenin aksine bir programlama dili değildir. Birbirinden farklı programlama dillerinin bir arada çalışmasını sağlayan platformdur.

.Net platformunu kullanarak farklı uygulamalar geliştirebiliriz. Windows Application (Windows Uygulama), Mobil Application (Windows Mobil), Wep Application (Web Sitesi), v.b…

.NET Framework, çeşitli hizmetler çalışan uygulamaları için sağlayan bir yönetilen yürütme ortamıdır. İki ana bileşenden oluşur: çalışan uygulamalar; işleyen yürütme altyapısı olan ortak dil çalışma zamanı (CLR) ve kitaplığını sağlar .NET Framework sınıf kitaplığı, test, geliştiriciler kendi uygulamalardan çağırabilirsiniz yeniden kullanılabilir kod. .NET Framework uygulamalarını çalıştırmak için sağladığı hizmetler şunlardır:

Bellek yönetimi, Ortak tür sistemi, Bir kapsamlı sınıf kitaplığı, Geliştirme çerçeveleri ve teknolojiler, Diller arası birlikte çalışabilirlik, Sürüm uyumluluğu, Yan yana yürütme, Çoklu sürüm desteği.

Detaylı Bilgi İçin: https://msdn.microsoft.com/tr-tr/library/hh425099(v=vs.110).aspx

.Net’in Yapı Taşları

-Common Language Runtime – CLR (Ortak Çalışma Zamanı)
.Net tiplerinin yerini öğrenme, yükleme ve yönetme işlemlerini yapar. Ayrıca bellek yönetimi, tip güvenliği gibi görevleri de vardır.

-Common Type System – CTS (Ortak Tip Sistemi)
Desteklenen veri tiplerini ve programlama yapılarını tanımlar. Bu yapıların birbiriyle olan ilişkilerini tanımlar.

-Common Language Spesification – CLS (Ortak Dil Spesifikasyonları)
.Net dillerinin ortak tip ve programlama altyapısını tanımlayan yönerge listesidir.

-Base Class Library – BCL (Temel Sınıf Kütüphanesi)

C# Programlama Dilinin Yapısı

Evet klasik Merhaba Dünya örneği ile başlayalım ne dersiniz. Onun üzerinden C# dilinin yapısını biraz inceleyelim.

Bu arada neden hep “Merhaba Dünya” hiç merak ettiniz mi?

Merhaba Dünya çünkü artık siz bir dünyalı değilsiniz. Güzel bir ironi dimi ama, bir yazılımcının kafasının artık dünyalı gibi çalışamayacağını artık yazılım dünyasına adım attığınız ilk andan itibaren farklı bir dünyadan bakmaya başladığını anlatamaya çalışan güzel bir ironidir. Kısacası; Artık siz, siz değilsiniz!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         Console.WriteLine("Merhaba Dünya");
      }
   }
}

Using Direktifi ve System İsim Alanı (Namespace)

Microsoft tarafından daha önceden hazırlınmış olan, temel programlama işlerini gerçekleştirmek için yazılım geliştiricilerin hizmetine sunulmuş sınıflardır diyebiliriz.

Mesela using System.Data, bu direktif temel veri tabanı işlemleri ile ilgili direktifleri saklar. Bu direktifleri kullanarak veri tabanı işlemlerini kolaylıkla gerçekleştirebiliriz.

Sınıf (Class)

Nesne tabanlı programlamada gereken nesneleri sınıflar yardımıyla oluşturmaktır. Sınıfları, nesneleri oluşturmak için önceden oluşturulmuş bir kalıp olarak düşünülebilir.

Her bir C# sınıfı birer .cs dosyasına yazılabildiği gibi. Bir .cs dosyasının içerisinde birden fazla sınıf tanımlaması yapılabilir.

Metod (Method)

Program yazarken kullanılan yöntemlerin bir blog halinde yazılımı şeklinde tanımlayabiliriz. Uygulamalarda herhangi bir işlemi yapmak için kullanılan kod parçacıklarıdır. Metotlar .NET ortamında var olduğu gibi kendimizde metotları oluşturabilmekteyiz.

Main Metodu: her bir yazılan programın bir başlangıç noktası olmalıdır. Main Metod işte tam bu görevi üstlenir. Bu metodun içerisine yazacağımız komutlar programı çalıştırdığımızda çalışmasını istediğimiz kodları kapsar.

Değişken Tanımlama ve Önceden Tanımlı Veri Tipleri

Değişkenler, girdiğimiz değerleri alan veya programın çalışmasıyla bazı değerlerin atandığı veri tutuculardır.

Değişken tanımlama söz dizimi aşağıdaki gibidir.

VeriTipi(string) DegiskenAdi(isim) = Değer(“fatih alkan”);

string isim;
int yas;

Veri türleri:

Tip Dönüşümleri

C#’da iki farklı tip değişim türü vardır. Bilinçsiz Dönüşüm (Implicit Conversion), Bilinçli Dönüşüm (Explicit Conversion)

Bilinçsiz Dönüşüm (Implicit Conversion)

C#’ta düşük kapasiteli bir değişken, sabit ya da değişken ve sabitlerden oluşan matematiksel ifade daha yüksek kapasiteli bir değişkene atanabilir. Buna bilinçsiz tür dönüşümü denir, bunun için herhangi bir özel kod gerekmez.

 

static void Main(string[] args)
{
   byte a = 5;
   short b = 10;
   sbyte c = 30;
   int d = a + b + c;
}

Bilinçli Dönüşüm (Explicit Conversion)

Bilinçli tür dönüşümü genellikle derleyicinin izin vermediği durumlarda kullanılır. Bilinçli tür dönüşümüyle küçük türün büyük türe dönüştürülmesi sağlanabilse de aslında bu gereksizdir, çünkü aynı şeyi bilinçsiz tür dönüşümüyle de yapabilirdik. Aşağıdaki programda bilinçli tür dönüşümü gerçekleştirilmektedir.

static void Main(string[] args)
{
   int a = 5;
   byte b = (byte)a;
}

Parse Methodu ve Convert Methodu

static void Main(string[] args)
{
   int deger = Convert.toInt32(TextBox1.Text);
   int deger = int.Parse(textBox1.Text);
}

Operatörler

C#, basit aritmetik işlemlerin yapılmasını sağlayan matematiksel işlemleri kapsar.

Birinci öncelikliler x++, x–
Tek operand alan operatörler +, -, !, ~, ++x, –x, (Tür)x
Çarpma ve bölme *, /, %
Toplama ve çıkarma +, –
Kaydırma operatörleri <<, >>
İlişkisel ve tür testi operatörleri <, >, <=, >=, is, as
Eşitlik operatörü ==, !=
Bitsel Ve (AND) &
Bitsel Özel Veya (XOR) ^
Bitsel Veya (OR) |
Mantıksal Ve &&
Mantıksal Veya ||
Koşul operatörü ?:
Atama ve işlemli atama operatörleri =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

Numaralandırıcı (Enumaration)

Numaralandırıcı, .Net dünyasındaki beş ana tipten biridir. Uygulamada kullanılacak bir değişkenin alacağı değerler, belli bir küme içerisinden seçilmeye uygunsa ve bu değerler önceden tanımlı tipler içerisinde yer almıyorsa numaralandırıcılar bu noktada oldukça faydalı olurlar.

namespace MerhabaDunya
{
   class Program
   {
      enum Mevsim
      {
         kış,
         ilkbahar,
         yaz,
         sonbahar
      }
      enum Mevsim2 
      //ID vermek istersek, = operatörünü kullanarak istediğimiz id'yi 
      atayabiliriz. eğer ID atamıcaksak kendisi otomatik olarak 0'dan 
      başlayarak id alacaktır.
      {
         kış = 1,
         ilkbahar = 4,
         yaz = 9,
         sonbahar = 3
      }
      static void Main(string[] args)
      {
         Mevsim degisken1 = Mevsim.ilkbahar;
         Console.WriteLine("Seçili mevsim {0}", degisken1);
         Console.WriteLine("Lütfen Mevsim Seçiniz. Kış=1, Yaz=9, 
         İlkbahar=4, Sonbahar=3");
         
         int secilensayi = int.Parse(Console.ReadLine());
         Mevsim2 mevsim = (Mevsim2)secilensayi;
         Console.WriteLine("Favori Mevsim {0}", mevsim);
      }
   }
}

Yapı (Struct)

Değer tipli davranışları benimserler. Bellekten düşmesi, tanımlandığı kapsama alanına bağlıdır. Bu şeklide bellekte nesneleri temsil etmek için kullanılabilir.

namespace MerhabaDunya
{
   class Program
   {
      struct Rehber
      {
         public string rehber_isim;
         public int rehber_no;
      }
      static void Main(string[] args)
      {
         Rehber rehber;
         rehber.rehber_isim = "Fatih ALKAN";
         rehber.rehber_no = 1;
         
         Console.WriteLine("İsim: {0}, No: {1}", rehber.rehber_isim, 
         rehber.rehber_no);
         //Yapı tanımlama "new" anahtar kelimesi ile tanımlanabilir.
         //Yapı tanımlanırken üyelerine ilk değerlerinin verilebilmesi 
         için kullanılır.
         Rehber rehber1 = new Rehber();
      }
   }
}

Kontrol Yapıları, Döngüler, İstisnalar

IF Kontrolü

namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         int not1 = 90;
         int not2 = 55;
         int ortalama = (not1 + not2) / 2;
         
         if (ortalama > 50)
         {
            Console.WriteLine("Geçtiniz...");
         }
         else
         {
            Console.WriteLine("Kaldınız...");
         }
      }
   }
}

IF ELSE IF Kontrolü

if (Koşul)
{
   //İşlem
}
else if(Koşul)
{
   //İşlem
}
else
{
   //İşlem
}

SWITCH Kontrolü

namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         int kararDegiskeni = 1;
         switch (kararDegiskeni)
         {
            case 1:
               Console.WriteLine("Karar 1");
               break;
            case 2:
               Console.WriteLine("Karar 2");
               break;
            default:
               Console.WriteLine("Varsayılan karar");
               break;
         }
      }
   }
}

WHILE Döngüsü

namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         int a = 1;
         while (a <= 6)
         {
            Console.WriteLine("dön baba dönelim");
            a++;
         }
      }
   }
}

DO-WHILE Döngüsü

namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         int[] ids = new int[] { 6, 7, 8, 10 };
         int sum = 0;
         int i = 0;
         do
         {
            sum += ids[i];
            i++;
         } while (i < 4);
         Console.WriteLine(sum);
      }
   }
}

FOR Döngüsü

namespace MerhabaDunya
{
   class Program
   {
      static void Main(string[] args)
      {
         for (int i = 1; i <= 10; i++)
         {
            Console.WriteLine(i);
         }
      }
   }
}

* Tab Tab: Bu arada, sizlere visual studio’nun bir özelliğinden bahsetmek istiyorum. For döngüsü, try catch gibi veya ileride yazacağımız metotları kısayol kullanarak oluşturabilirsiniz. Örneğin for döngüsü oluşturmak için visual studio editör ekranında f harfine bastıktan sonra imlecin tamamladığı for’un üstüne gelere iki kere tab tuşu tuşuna basarsanız kendiliğinde oluşturduğunu göreceksiniz.

Atlama (Jump) Deyimleri

  • Break: bir daha dönmemek üzere döngünün sonuna götürür.
  • Continue: kendisini çevreleyen en yakın döngünün başına transfer eder. Yani döngüyü bir tur erteler.
  • Goto: etiketlenmiş bir noktaya transfer eder.
  • Return: bir metotun çalışmasını sonlandırır.
  • Throw: program akışı sırasında oluşan alışılmışın dışında bir durumu(exception) işaret etmek için kullanılır. 

Try (Dene) Catch (Yakala)

Programın çalışma zamanında oluşabilecek hataları (exception) yakalayabilmek için kullanılır. Eğer bir uygulama geliştirmek istiyorsak oluşacak hataları değerlendirmek zorundayız. Bir nevi hayat ilişkisi gibi. Nasıl ki hayatımızda hata yaptığımız zaman tecrübe kazanıp bir sonra ki adımı daha dikkatli atıyorsak ilerleyen zamanlarda daha kaliteli bir uygulama geliştirmek istiyorsak exception’lardan faydalanmasını bilmeliyiz. Bu nedenle ben try catch bloğunu her zaman önemli bulmuşumdur.

static void Main(string[] args)
{
   try
   {
      //Kod blogumuzu yazacağımız kısım
      //Çalışmasını istediğimiz kodları veya metotları yazacağımız kısım
   }
   catch (Exception)
   {
      //Eğer bir hata olursa yakalayacağımız kısım
      //Yazdığımız kod'da eğer bir hata olursa işlem buraya düşecektir.
      //Gerisi bize kalmış buraya düşün hatayı istediğimiz gibi 
      değerlendirebiliriz.
      //İster bir loglama methodu yazarız düşen hatayı alır 
      not defterine kaybedebiliriz.
      //Veya if gibi kullanabiliriz. Yazdığımız bir metotta hata olursa
      diğer metodu kullan gibi.
      //Ve ben bunu oldukça sık yaparım. If gibi kullanırım ;)
   throw;
   }
}

Exceptionı Mesaj Olarak Yazdırma

try
{
   //Kod blogumuzu yazacağımız kısım
}
catch (Exception hata)
{
   string Mesaj;
   Mesaj = hata.Message.ToString();
}

Diziler ve Koleksiyonlar

Diziler aynı tipte değerlerin bir arada saklanmasını sağlayan referans tipli programlama öğesidir. Diziler tek bir tipten değer tutabildikleri için tanımlama sırasında tip belirtilmelidir. Ayrıca oluşturacağımızı dizinin taşıyacağı değer sayısını veya değeri belirletmek zorundayız.

static void Main(string[] args)
{
   int[] sayilarim1 = new int[4];
   // veya
   int[] sayilarim2 = new int[] { 1, 2, 3, 4 };
   // veya
   int[] sayilarim3 = new int[4] { 1, 2, 3, 4 };
}

Dizi Elemanına Erişmek

static void Main(string[] args)
{
   // Değer Atama
   int[] sayilarim1 = new int[4];
   sayilarim1[0] = 1;
   sayilarim1[1] = 2;
   sayilarim1[2] = 3;
   sayilarim1[3] = 4;
   // Atanmış Değeri Alma
   //* Dizi indexi 0'dan başlar.
   int[] sayilarim3 = new int[4] {1,2,3,4};
   int sayi1 = sayilarim3[0];
   int sayi2 = sayilarim3[1];
   int sayi3 = sayilarim3[2];
   int sayi4 = sayilarim3[3];
}

Koleksiyonlara Giriş

Tüm bunlardan sıkıldınız mı? Sadece belirli bir tipten dizi oluştur. Dizi boyutunu önceden belirle. Haydi tek tipten kurtulmak için Object denediniz. Ama hala boyuttan kutulamadınız. İşte, koleksiyonlar tam olarak bunu sağlıyorlar.

*Object Dizi Örneği:

static void Main(string[] args)
{
   Object[] KarmaDizi = new Object[]{'F',true,"Fatih",0,45};
}

Koleksiyon

static void Main(string[] args)
{
   ArrayList koleksiyon = new ArrayList();
   //koleksiyona object tipinden eleman eklenir.
   koleksiyon.Add(1);
   koleksiyon.Add("Fatih");
   koleksiyon.Add(30);
   koleksiyon.Add(new DateTime(1987,31,03));

   //Bunu unutmayın koleksiyonda elamanlarına, 
   dönüşüm (cast) yaparak erişilir.
   //Çünkü koleksiyonlar object değer tutarlar.

   string name = (string)koleksiyon[1];
   int age = (int)koleksiyon[2];
}

Metotlar

Bir kod bloğunun tamamına isim verip, uygulamanın başka yerlerinde , o isimle çağırıp yeniden kullanılmasına izin veren programlama öğeleridir. Ben bunu matematikte kümelemeye benzetirim. Örneğin bir kullanıcıya mail göndermek için 30 satır kod yazdınız. Bu kodu bir küme içine alıp adına da mail gönder kümesi dediğinizi düşünün. Sonra bu kümeyi başka bir sayfada yeniden mail atmak istediğinizde tüm kod satırları tekrar yazmanıza gerek yoktur sadece kümenin ismini yazsanız aynı işlemi yapacaktır. İşte metotlar bu işe yarar, sizi tekrar tekrar kod yazmaktan kurtarır. Yazdığını bir takım kodları metot başlığı altında toplayıp ileride bir başka yerde sadece ismiyle çağırıp aynı işlemi yapmanıza yarar.

*Metot oluşturma söz dizimi

ErişimBelirleyicisi – Dönüş Tipi – Niteliyici(varsa) – MetotAdi (Parametre Listesi(varsa)

{

//Oluşturduğunuz kod satırları.

}

*Metot çağırma

MetotAdi (Parametre Listesi(varsa);

Erişim Belirleycisi: metota hangi ortamlardan erişebileceğimizi belirlemek için kullanılır. Örneğin, Private: sadece yazıldığı sınıf ve yapı içerisinde erişim sağlayabilirsiniz. Public: metodun her yerden çağrılabilmesini sağlar.

Dönüş Tipi: adı üstünde metodun ne değer döndüreceğini belirttiğiniz tipdir. İnt, String gibi önceden tanımlı tiplerde olabilir veya kendi yazdığınız bir tipde olabilir. Metot eğer geriye değer döndürmeyecek sadece kendi içinde bir işlem yapacaksa void değerini alır.

Niteliyici: static, abstract, sealed, virtual kelimelerini alır. İleride detaylı bahsedilecek.

MetotAdı: metot çağırılırken kullanılacak isim:

Parametreler: opsiyoneldir, kullanılabilirde kullanılmayabilirde.

class Program
{
   public static void MesajYazdir()
   {
      Console.WriteLine("Metot Oluştudunuz...");
   }
   public static int ToplamaIslemi(int _BirinciSayi, int _IkinciSayi)
   {
      int sonuc;
      sonuc = _BirinciSayi + _IkinciSayi;
      return sonuc;
   }
   static void Main(string[] args)
   {
      MesajYazdir();
      ToplamaIslemi(5,10);
   }
}

Sınıf Kavramı

Sınıf (class), veriler içeren ve bu verileri işleyen hem de metotlar ve diğer üyeler ile iş mantığı fonksiyonelliği sağlayan veri tipidir.

Sınıfları şu şekilde daha iyi anlatabiliriz, Örneğin bir araba düşünün. Arabanın rengi, kapı sayısı, modeli gibi özellikleri vardır. Ayrıca bir  arabada kapıları kilitlemek, pencereleri açmak gibi işlemleri (davranışlar) vardır. Bu arabının özelliklerine tip, davranışlarına metot, arabanın kendisine ise sınıf deriz.

namespace MerhabaDunya
{
   class Daire
   {
      public double yaricap;
      public double AlanHesapla()
      {
         return 3.14 * yaricap * yaricap;
      }
   }
   class Program
   {
      static void Main(string[] args)
      {
         Daire d1 = new Daire();
         d1.yaricap = 8;

         Daire d2 = new Daire();
         d2.yaricap = 5;
      }
   }
}