DotNet ve VSC kuruldu. Kodumuzu test edebilmek için her bir projemizi konsol programı olarak kuracağız. Bunun için klasörümüzü terminalde açıp terminale
dotnet new consoleyazıyoruz.
Kodumuzu çalıştırmak için VSC içinde en soldan "Run and Debug"ı seçip "Run" simgesine basıyoruz.
Run kurulumu için ilgili DotNEt sürümünü seçiyoruz. Terminalden veri gönderebilmek için ".vscode>settings.json" içinde aşağıdaki değişikliği yapıyoruz.
...
"console": "integratedTerminal",
...
Run dediğimizde "Program.cs" içindeki kod çalışır.
//TAM SAYILAR
byte b = 5; // 0-255 arası değer alır. 1 byte yer kaplar
sbyte c = 5; // -127-127 arası değer alır. 1 byte yer kaplar.
short s = 5; // -32.768 - +32.768 arası değer alır 2 byte yer kaplar
ushort us = 5; // 0-65.365 arası değer alır. 2 byte yer kaplar
Int16 i16 = 5; // 2 byte yer kaplar
int i = 5; // 4 byte yer kaplar -2.147.483.648 - 2.147.483.648 arası değer alır.
Int32 i32 = 5; // 4 byte yer kaplar
Int64 i64 = 5; // 8 byte yer kaplar
uint ui = 5; // 4 byte
long l = 5; // 8 byte
ulong ul = 5; // 8 byte
//REEL SAYILAR
float f = 5.5f; // 4 byte
double d = 5.5f; // 8 byte
decimal de = 0.5m; // 16 byte
//YAZI
char ch = 'C'; // Tek karakter tutar. 2 byte
string st = "Sınırsız karakter"; // sınırsız
//BOOL
bool bl = true;
//ZAMAN
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
//OBJECT (her tür değişkeni tutar)
object o1 = "x";
object o2 = 4;
object o3 = 4.2f;
//string ifadeler
string str1 = string.Empty; // null, "", string.Empty boş string oluşturur.
str1 = "Murat GÖKDUMAN";
string ad = "Murat";
string soyad = "GÖKDUMAN";
string tamisim = ad + " " + soyad; //tamisim = "Murat GÖKDUMAN"
//integer ifadeler
int int1 = 5;
int int2 = 3;
int int3 = int1 * int2; // int3 = 15
//boolean ifadeler
bool bl1 = 10 < 2; //false
//Değişken dönüşümleri
string str20 = "20";
int int20 = 20;
string yenideger = str20 + int20.ToString(); // yenideger = "2020"
int int21 = int20 + Convert.ToInt32(str20);// int21 = 40
int int22 = int20 + int.Parse(str20); // int22 = 40 (Parse() sadece string ifadelerde çalışır.)
//dateTime
string dateTime = DateTime.Now.ToString("dd.mm.yyyy"); // dateTime = "23.05.2025"
string dateTime2 = DateTime.Now.ToString("dd/mm/yy"); // dateTime2 = "23/05/25"
string dateTime3 = DateTime.Now.ToString("hh:mm:ss"); // 04:45:57
Console.WriteLine(dateTime3);
// Implicit Conversion (bilinçli dönüşüm): Düşük kapasiteli değişkenin daha yüksek kapasiteli değişkene dönüşmesi. C# kendisi yapar.
byte a = 5;
sbyte b = 30;
short c = 10;
int d = a + b + c; // int daha yüksek kapasiteli olduğundan hata vermeden dönüşür.
long h = d; // long da int den daha büyük kapasiteli
float i = h;
char e = 'A';
string f = "Murat";
string g = f + e;
object j = e + f + d; // string charı, object ise hepsini kapsar.
// Explicit Conversion (bilinçli Dönüşüm) C# kendisi yapamaz. Biz kod ile yaparız.
int x = 4;
byte y = (byte)x; // sağdaki veriyi parantez içindekine dönüştürmeye çalışır.
int z = 100;
byte t = (byte)z;
float w = 10.3f;
byte v = (byte)w; // v = 10 olur.
// ToString(): veriyi string yapar.
int xx = 6;
string yy = xx.ToString();
string zz = 12.5f.ToString();
//System.Convert
string s1 = "10", s2 = "20";
int sayi1, sayi2;
int toplam;
sayi1 = Convert.ToInt32(s1);
sayi2 = Convert.ToInt32(s2);
toplam = sayi1 + sayi2;
//Parse(string): sadece string ifadelerde kullanılır.
ParseMethod(); // değişken isimlerini tekrar kullanabilmek için ayrı bir fonksiyon oluştuldu ve bu fonksiyon burada çağırıldı.
void ParseMethod()
{
string metin1 = "10";
string metin2 = "10.25";
int rakam1;
double double1;
rakam1 = Int32.Parse(metin1); // 10
double1 = Double.Parse(metin2); // 10.25
}
Hatalar ikiye ayrılır. Compile-time hatalar derleme sırasında derleyicinin verdiği hatalardır. Söz dizimi hataları, değişken hataları vs. Run Time hatalar ise kod çalıştırıldığında ortaya çıkar. Bunları yakalamak için try-catch-finally yapısı kullanılabilir.
try // hataya neden olabilecek kodu yazıyoruz.
{
Console.WriteLine("Bir Sayı Gİriniz");
int sayi = Convert.ToInt32(Console.ReadLine()); // int bir değer girilmezse hata verir.
Console.WriteLine("Girdiğiniz sayı: " + sayi);
}
catch (Exception ex) //Exception classında ex değişkeni ile hata yakalandı.
{
Console.WriteLine("Hata1: " + ex);
}
finally // kod hata alsın veya almasın çalışacak kodlar buraya yazılır. Bu alanın varlığı opsiyonel.
{
Console.WriteLine("İşlem Tamamlandı");
}
// Boş arguman yakalama örneği
try
{
int a = int.Parse(null); // hata vermesi için null verildi.
}
catch (ArgumentNullException ex) // hata null hatası ise aşağıdaki kodu çalıştırır.
{
Console.WriteLine("Boş değer girdiniz");
Console.WriteLine("hata2: " + ex);
}
// Hatalı format yakalama örneği
try
{
int a = int.Parse("aaa"); // hata vermesi için yanlış format verildi.
}
catch (FormatException ex) // hata format hatası ise aşağıdaki kodu çalıştırır.
{
Console.WriteLine("Veri tipi uygun değil");
Console.WriteLine("hata3: " + ex);
}
// değişkenin aralığının dışında hata yakalama örneği
try
{
int i = int.Parse("-2000000000000"); // hata vermesi için int kapsamı dışında bir değer verildi.
}
catch (OverflowException ex)
{
Console.WriteLine("Çok küçük veya çok büyük değer girdiniz.");
Console.WriteLine("hata4: " + ex);
}
Konsoldan dönen cevaplar:
Bir Sayı Gİriniz
To send text to the target process's standard input, enter text into the Debug Console's evaluation box while the target process is running. See https://aka.ms/VSCode-CS-LaunchJson-Console for more information.
a
Exception thrown: 'System.FormatException' in System.Private.CoreLib.dll
Hata1: System.FormatException: The input string 'a' was not in a correct format.
at System.Number.ThrowFormatException[TChar](ReadOnlySpan`1 value)
at System.Convert.ToInt32(String value)
at Program.<Main>$(String[] args) in C:\Users\at00648\OneDrive - Alliance\Masaüstü2\Patika CSharp101\Hata Yönetimi\Program.cs:line 4
İşlem Tamamlandı
Exception thrown: 'System.ArgumentNullException' in System.Private.CoreLib.dll
Boş değer girdiniz
hata2: System.ArgumentNullException: Value cannot be null. (Parameter 's')
at System.Int32.Parse(String s)
at Program.<Main>$(String[] args) in C:\Users\at00648\OneDrive - Alliance\Masaüstü2\Patika CSharp101\Hata Yönetimi\Program.cs:line 18
Exception thrown: 'System.FormatException' in System.Private.CoreLib.dll
Veri tipi uygun değil
hata3: System.FormatException: The input string 'aaa' was not in a correct format.
at System.Number.ThrowFormatException[TChar](ReadOnlySpan`1 value)
at System.Int32.Parse(String s)
at Program.<Main>$(String[] args) in C:\Users\at00648\OneDrive - Alliance\Masaüstü2\Patika CSharp101\Hata Yönetimi\Program.cs:line 27
Exception thrown: 'System.OverflowException' in System.Private.CoreLib.dll
Çok küçük veya çok büyük değer girdiniz.
hata4: System.OverflowException: Value was either too large or too small for an Int32.
at System.Number.ThrowOverflowException[TInteger]()
at System.Int32.Parse(String s)
at Program.<Main>$(String[] args) in C:\Users\at00648\OneDrive - Alliance\Masaüstü2\Patika CSharp101\Hata Yönetimi\Program.cs:line 37
The program '[17296] Hata Yönetimi.exe' has exited with code 0 (0x0).
VSC kodlarımızın satır numarasının soluna tıklarsak "breakpoint" oluşturur. "Debug and Run" ekranında "run" yaptığımızda kodumuz bu "breakpoint"lerde durur ve bizim en üstte çıkan menüden devam ettirmemizi bekler. Run sırasında takip etmek istediğimiz değişkenleri sağ tıklayıp "add the watch" seçerek değişkeni watch ekranında takip edip değişiklik yapabiliyormuşuz.
Normal bildiğimiz if yapısının yaı sıra değişkene şartlı bir şey atarken aşağıdaki yapı da kullanılabilir.
int time = DateTime.Now.Hour
string selamlama = time>18 ? "iyi akşamlar" : "iyi geceler"
Soru işaretinden önceki şart true ise ilk kısım değil ise ikinci kısım "selamlama" değişkenine atanır.
Birden fazla koşul iç içe de yazılabilir.
string selamlama = time >= 6 && time < 12 ? "Günaydın" : time < 18 ? "iyi akşamlar" : "iyi geceler"
Sabit değerlerle (sayı, harf, enum) kontrol yapılacaksa kullanılır.
int mounth = DateTime.Now.Month;
switch (mounth) // parantez içinde kontrol edeceğimiz değişken verilir.
{
case 1: // case ifadesinden sonra kontrol edilecek değişkenin eşit olması istenen değer yazıldı. Sırayla kontrol eder
Console.WriteLine("Ocak Ayındasınız");
break; // switch - case bloğunu sonlandırır.
case 2:
Console.WriteLine("Şubat Ayındasınız");
break;
case 3:
Console.WriteLine("Mart Ayındasınız");
break;
case 4:
Console.WriteLine("Nisan Ayındasınız");
break;
case 5:
Console.WriteLine("Mayıs Ayındasınız");
break;
case 6:
Console.WriteLine("Haziran Ayındasınız");
break;
case 7:
Console.WriteLine("Temmuz Ayındasınız");
break;
case 8:
Console.WriteLine("Ağustos Ayındasınız");
break;
case 9:
Console.WriteLine("Eylül Ayındasınız");
break;
case 10:
Console.WriteLine("Ekim Ayındasınız");
break;
case 11:
Console.WriteLine("Kasım Ayındasınız");
break;
case 12:
Console.WriteLine("Aralık Ayındasınız");
break;
default:
Console.WriteLine("Hatalı veri girişi");
break;
}
switch (mounth) // birden fazla koşul için aynı sonuç alınacaksa bu koşullar alt alta yazılır. en alta yapılacak işlem ve break yazılır. Breakten önceki doğru olan şartlardan biri uyuyorsa o kod çalışır. yoksa atlayıp bir sonraki grubu değerlendirir.
{
case 12:
case 1:
case 2:
Console.WriteLine("Kış Mevsimindesiniz");
break;
case 3:
case 4:
case 5:
Console.WriteLine("Bahar Mevsimindesiniz");
break;
case 6:
case 7:
case 8:
Console.WriteLine("Yaz Mevsimindesiniz");
break;
case 9:
case 10:
case 11:
Console.WriteLine("Sonbahar mevsimindesiniz");
break;
default:
Console.WriteLine("Hatalı veri");
break;
}
// Switch Expression ve Pattern Matching (C# 8.0+)
// üstteki ifadelerin switch expression ile yazılmışları:
string ayMesaj = mounth switch
{
1 => "Ocak Ayındasınız",
2 => "Şubat Ayındasınız",
3 => "Mart Ayındasınız",
4 => "Nisan Ayındasınız",
5 => "Mayıs Ayındasınız",
6 => "Haziran Ayındasınız",
7 => "Temmuz Ayındasınız",
8 => "Ağustos Ayındasınız",
9 => "Eylül Ayındasınız",
10 => "Ekim Ayındasınız",
11 => "Kasım Ayındasınız",
12 => "Aralık Ayındasınız",
_ => "hata"
};
Console.WriteLine(ayMesaj);
string mevsimMesaj = mounth switch
{
12 or 1 or 2 => "Kış Mevsimindesiniz",
3 or 4 or 5 => "İlkbahar mevsimindesiniz",
6 or 7 or 8 => "Yaz Mevsimindesiniz",
9 or 10 or 11 => "Sonbahar Mevsimindesiniz",
_ => "Geçersiz ay"
};
Console.WriteLine(mevsimMesaj);
// ekrandan verilen değere kadar olan tek sayıları yazdır.
int sayac = int.Parse(Console.ReadLine());
for (int i = 1; i <= sayac; i++)
{
if (i % 2 == 1)
{
Console.WriteLine(i);
}
}
//1 den 1000 e kadar olan tek sayıların ve çift sayıların toplamını ayrı ayrı yazdır.
int tekToplam = 0;
int ciftToplam = 0;
for (int i = 1; i < 1000; i++)
{
if (i % 2 == 1)
tekToplam += i; // şartın sonucunda çalışacak kod tek satır ise {} gerekmiyor.
else
ciftToplam += i;
}
Console.WriteLine("Tek toplam: " + tekToplam);
Console.WriteLine("Çift toplam: " + ciftToplam);
// break: for döndüsünden çıkartır, continue mevcut loopu atlayıp fora devam ettirir.
//break
for (int i = 1; i <= 10; i++)
{
if (i == 4) // i=4 ise
break; // döngü biter. İç içe döngülerde sadece içinde olduğu döngüyü sonlandırır. Dıştaki döngü devam eder.
Console.WriteLine(i); // çıktı: 1, 2, 3
}
//continue
for (int i = 1; i <= 10; i++)
{
if (i == 4) // i=4 ise
continue; // döngüyü atlar
Console.WriteLine(i); // çıktı: 1, 2, 3, 5, 6, 7, 8, 9, 10 (4 yok)
}
//While: bir koşul true olduğu sürece döngüyü çalıştırır.
// 1 den başlayarak konsolda girilen sayıya kadar, sayı dahil ortalama hesaplayıp konsola yazdıran kod:
using System.Diagnostics;
Console.Write("Lütfen bir Sayi Giriniz");
int sayi = int.Parse(Console.ReadLine());
int sayac = 1;
int toplam = 0;
while (sayac <= sayi)// parantez içimdeki ifade true olduğu sürece içerideki fonksiyonu devam ettirir
{
toplam += sayac;
sayac++;
}
float ortalama = toplam / sayi;
Console.WriteLine(ortalama);
//a-z tüm harfleri konsola yazdır
char character = 'a';
while (character <= 'z')
{
Console.Write(character);
character++;
}
//foreach: Bir listedeki tüm ögeler için döngüyü çalıştırır.
string[] arabalar = { "bmw", "ford", "toyota", "nissan" };
foreach (var araba in arabalar)// verilen listedeki her elemanı araba değişkenine alır ve onunla işlem yapar.
{
Console.WriteLine(araba);
}
// dizi oluşturma
string[] renkler = new string[5]; // adı renkler olan 5 elemanlı elemanları belli olmayan dizi.
string[] hayvanlar = { "kedi", "köpek", "tavuk", "kuş" }; // elemanları belli olan bir dizi.
int[] sayilar; // eleman sayısı ve elemanları belirsiz dizi
sayilar = new int[5]; // dizinin eleman sayısını 5 yaptık.
// dizilere değer atama ve erişim
renkler[0] = "mavi"; //renkler dizisinin ilk elamnını "mavi" olarak atadık.
string hayvan1 = hayvanlar[1]; // hayvan1 değişkenine dizinin ikinci elemanı olan "köpek" atandı
sayilar[3] = 10; // sayilar dizisinin 4. elemanını 10 olarak atadık.
// döngülerle dizi kullanımı
// klavyeden girilen "n" kadar sayının ortalamasını alan fonksiyon:
Console.Write("Lütfen dizinin eleman sayısını giriniz :");
int diziUzunlugu = int.Parse(Console.ReadLine());
int[] sayiDizisi = new int[diziUzunlugu];
for (int i = 0; i < diziUzunlugu; i++)
{
Console.Write("Lütfen {0}. sayıyı giriniz", i + 1);
sayiDizisi[i] = int.Parse(Console.ReadLine());
}
int toplam = 0;
foreach (var sayi in sayiDizisi)
{
toplam += sayi;
}
Console.Write(toplam / diziUzunlugu);
int[] sayiDizisi = { 23, 12, 86, 72, 4, 3, 11, 17 };
// ListeyiYazdir(sayiDizisi); // Çıktı: 23, 12, 86, 72, 4, 3, 11, 17
//Array.Sort(dizi)
Array.Sort(sayiDizisi);
// ListeyiYazdir(sayiDizisi); // Çıktı: 3, 4, 11, 12, 17, 23, 72, 86
//Array.Clear(dizi, index, uzunluk) verilen parametreye göre dizideki değerleri sıfırlar
Array.Clear(sayiDizisi, 2, 3); // index 2 den itibaren 3 tane sıfırla
// ListeyiYazdir(sayiDizisi); // Çıktı: 3, 4, 0, 0, 0, 23, 72, 86
//Array.Reverse(dizi) dizinin yönünü değiştirir
Array.Reverse(sayiDizisi);
// ListeyiYazdir(sayiDizisi); // Çıktı: 86, 72, 23, 0, 0, 0, 4, 3
//Array.IndexOf(dizi, değer) //verilen değer hangi indexte
// Console.WriteLine(Array.IndexOf(sayiDizisi, 23)); // çıktı: 2
//Array.Resize<tip>(ref dizi, boyut);
Array.Resize<int>(ref sayiDizisi, 9); // başlangıçta 8 elemanlı sayıDizisini sonuna eleman ekleyerek 9 elemanlı yaptık. Eleman sayısını azaltınca da sondan siliyor.
ListeyiYazdir(sayiDizisi); // Çıktı: 86, 72, 23, 0, 0, 0, 4, 3, 0
void ListeyiYazdir(int[] sayiDizisi)// değişiklikleri konsolda takip etmek icin fonksiyon.
{
foreach (var sayi in sayiDizisi)
Console.WriteLine(sayi);
}
// METOT
/*
Erişim_belirteci geri_dönüş_tipi metot_adı(parametre listesi)
{
fonksiyon
};
*/
int a = 2;
int b = 3;
int sonuc = Topla(a, b); // fonksiyon çağırıldı.
static int Topla(int deger1, int deger2) // Aynı classta tanımlı fonkisyon
{
return deger1 + deger2;
}
// Başka Bir Klastan Fonksiyon Çağırmak
Metotlar ornek = new Metotlar(); //farklı bir classta tanımlı fonksiyona erişmek için önce o klasın bir örneği alındı.
ornek.EkranaYazdir(sonuc.ToString()); //alınan örneğin altındaki public fonksiyon çağırıldı.
//Referans ve Kopya Değer ile Çalışmak
int sonuc2 = ornek.ArttırVeTopla(a, b); // kopyalarla çalışan fonksiyon
ornek.EkranaYazdir(sonuc2.ToString()); // 7
ornek.EkranaYazdir((a+b).ToString()); // orijinal değerlerin toplamı başlangıçtaki ile aynı: 5
//ref
sonuc2 = ornek.ArttırVeTopla2(ref a, ref b); // orijinalleri etkileyen fonksiyon
ornek.EkranaYazdir(sonuc2.ToString()); // 7
ornek.EkranaYazdir((a+b).ToString()); // orijinal değerlerin toplamı değişti: 7
class Metotlar // Harici klas
{
public void EkranaYazdir(string veri)
{
Console.WriteLine(veri);
}
public int ArttırVeTopla(int deger1, int deger2) // referans olarak alınan değeri içerideki değişkene atar. Değeri değiştirmez. Atanan yeni değişken de fonksiyonun işlevi bitince silinir. (kopyalarla çalışır)
{
deger1 += 1;
deger2 += 1;
return deger1 + deger2;
}
// ref (Referans)
public int ArttırVeTopla2(ref int deger1, ref int deger2) // referans olarak verilen değerin kendisini alır. Değeri değiştirir. (orijinal değerlerle çalışır)
{
deger1 += 1;
deger2 += 1;
return deger1 + deger2;
}
}
// Out parametreler
string sayi = Console.ReadLine();
bool sonuc = int.TryParse(sayi, out int outSayi); // outdan sonra verilen değişken fonksiyon dışında da kullanılabilir. Global bir değişkendir.
/*
bu kod şu şekilde de yazılabilir:
int outSayi;
bool sonuc = int.TryParse(sayi, out outSayi);
*/
if (sonuc)
{
Console.WriteLine("Başarılı");
Console.WriteLine(outSayi);
}
else
{
Console.WriteLine("Başarısız");
}
Metotlar instance = new Metotlar();
instance.Toplam(4, 5, out int toplamaSonucu); // out pramaetre ile yazılan fonksiyon çağırıldı. parametre içinde yaratılan out özellikli değişkenle sonuç yakalandı.
Console.WriteLine(toplamaSonucu);
// Metot Aşırıyükleme
/*
fonksiyonun adı aynı kalarak ama imzası değişerek aynı ada farklı parametre verildiğinde farklı işlem yapması sağlanması durumudur.
fonksiyonun imzası:
metod_adı + parametre_sayısı + parametre_tipleri
*/
// değişken tipi ve sayısı değiştiğinde çalışan fonksiyon da değişir.
instance.EkranaYazdir("Murat"); // string: Murat
instance.EkranaYazdir(18); // int: 18
instance.EkranaYazdir("Murat", "Esra"); // Strings: Murat ve Esra
class Metotlar
{
public void Toplam(int a, int b, out int toplam) // return yerine out parametre ile yazılan fonksiyon. return edilen değer olmadığından void olarak yazıldı.
{
toplam = a + b;
}
//Aşırı yüklenen fonksiyon(EkranaYazdir();)
public void EkranaYazdir(string veri)
{
Console.WriteLine("string: " + veri);
}
public void EkranaYazdir(int veri)
{
Console.WriteLine("int: " + veri);
}
public void EkranaYazdir(string veri1, string veri2)
{
Console.WriteLine("Strings: " + veri1 + " ve " + veri2);
}
}