Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C# Tutorial - Giriş


Öne çıkan mesajlar

Mesaj tarihi:
şimdi bu yazımızda C#'a giriş yapacağız. bu yazıyı mümkün olduğunca yazılım bilgisi düşük seviyede olan arkadaşlara hitaben yazmaya çalışacağım. "yazılım bilgisi düşük" derken algoritma anlatmayı düşünmüyorum. zaten algoritma anlatılmaz yaşanır. [algoritma: döngülerin kurulumu vs gibi yazılımın hazırlanması için kurulan şey. (çok komik oldu. birisi benim yerime açıklasın)]

pek tabii ki burada bir kitabın anlattığı gibi C#'ı anlatamam. Çoooook uzun sürer. O yüzden RunUO ile ilgili bölümlerini, bu konuda bilmeniz gerekenleri anlatmak daha kolayıma geliyor :)

Yazımı bir kaç bölüme ayırdım. böylece hem erişilebilirliği hem de düzenlenebilirliği artar diye düşünüyorum..

Unuttuğum bir bölüm varsa bu konu içinde bildirirseniz elimden geldiğince yazıp göndermeye çalışırım.[signature][hline]its supersonic
Mesaj tarihi:
[ Temel Değişkenler ]
Öncelikle değişkenlerden başlayalım. "-Değişken nedir? -Değişen birşeydir." bu dialog komik gelse de çok doğrudur. ama hala komiktir. fakat doğruluğunu kaybetmeden komiktir. amaaan. Değişken dediğin ileride kullanılmak üzere bir bilginin dinamik(hareketli, non-static) olarak bellekte tutulmasıdır. bize de bir referans verilir bu da o değişkenin adıdır. Ayrıca değişkenin değerinin ve adının dışında olmazsa olmazlarından biri de değişkenin türüdür. bizim konumuzla ilgili bir değişken genel olarak ya metinsel (string) ya da sayısal (int, yani integer) olabilir. bunun dışında evet/hayır değişken dediğimiz (aslında kimse evet/hayır değişken demez, şimdi uydurdum ve farkındayım ki çok komik oldu) asıl adı boolean olan değişkenler vardır. bunlar doğru ya da yanlış değerini alabilirler. (true/false)

daha somut örneklendirmek gerekirse
int i; şeklinde bir satır i isminde int(integer yani sayısal) veri tipinde bir değişken tanımlar
string ali; şeklindeki bir satır ise ali isminde string(yani metinsel) bir değişken tanımlar

bool tey = true; şeklinde bir tanımlama da tey adında bool(boolean yani evet/hayır (hala komik oluyor)) veri tipinde bir değişken tanımlar ve bu değişkene true değerini atar.
int i = 30;
string isim = "MumChamber"; gibi tanımlamalar da mevcuttur.

Buraya kadarki bölümde bilmeniz gerekir ki sayısal değişkenler sadece int'ten oluşmazlar. aynı zamanda float, double, int16, int32, int64 gibi değişkenler de mevcuttur. aslında int diye bir tür yoktur. int yazdığınızda IDE (integrated development environment) onu direkt olarak int32'ye çevirir. yani kısayoldur.

değişken veri tipleri hakkında en büyük yanılsama şu şekildedir:
string a = 30; burada a isminde bir değişken yaratıyor ve bunun değeri 30. fakat "otuz" değil. "üç, sıfır" yani a + 5 şeklinde bir işlem yapılması mümkün değil. fakat
int i = 30; olmuş olsaydı, i + 5 = 35 diyebilecektik.

Değişkenleri birbirine çevirmek
peki diyelim ki string a şeklinde tanımladınız ve bu değeri sayıya çevirmek istiyorsunuz. çok basit. Integer.Parse(a) derseniz a'nın içindeki "üç, sıfır", "otuz" a çevirilerek bellekte farklı bir yere alınacaktır ve bu değişiklik a'nın değerinde yapılmayacaktır. yani a hala "üç, sıfır" olarak beklemektedir. örnek verilecek olursa:

Integer.Parse(a) + 5 = 35
a + 5 = hala hata (cannot explicitly convert string to integer gibi bişey) çünkü a hala string..

bu arada veri tipi değiştirmek için String.Parse ve Integer.Parse metodlarını kullanabilirsiniz.

Temel String Manipülasyonu
String manipülasyonu aslında yazılımın cam damarlarından biridir. fakat burada sadece temel olarak iki stringi birbirine eklemeyi göreceğiz:

string ad = "Mum";
string soyad = "Chamber"

Console.WriteLine( ad + "_" + soyad ) derseniz konsolda
"Mum_Chamber" yazacaktır. Yani stringleri "+" operatörüyle birbirine ekleyebileceksiniz.


bu arada hemen bir not daha gireyim. Bu iki değişken arasında çoğu yazılımcının bilmediği bir fark da vardır. string değişkenler için bellekte yer ayrıldıktan sonra o yerin üstüne tekrar yazılamaz. siz bu değişkeni değiştirdiğinizde bellekte yeni bir yer açılır ve eskisi başıboş bırakılır (ta ki Garbage Collector gelene dek). bu da demektir ki string değişkenler mümkün olduğunca az kullanılmalıdır.

Değişkenlerde genel olarak bilmeniz gereken başka birşey ise dizelerdir. ya da dizilerdir. dize ile diziyi ben hep karıştırıyorum. asıl adı "array"dir. biz dizi diyelim şimdilik. doğrusunu siz öğrenirsiniz. diziler birden fazla aynı tip ve aynı isimde değişkeni içlerinde barındırırlar.

string[] isimler; diye bir tanımlama isimler isminde sonu belirlenmemiş bir dizi tanımlar.
isimler[0] = "Ali";
isimler[1] = "Veli";
isimler[2] = "Hasan"; şeklinde kullanabilirsiniz. Dikkat etmeniz gereken husus, diziler 0 ile başlarlar.

Şimdi değişkenleri genel olarak öğrendikten sonra mantıksal sorgulara geçelim.[signature][hline]its supersonic

[Bu mesaj MumChamber tarafından 14 February 2004 13:58 tarihinde değiştirilmiştir]
Mesaj tarihi:
[ Mantıksal Sorgular, Döngüler ]
Mantıksal sorgular adından anlaşıldığı gibi mantıklı değildirler. hatta bazıları sizi delirtecek kadar sorunlu olabilir. mantıksal sorgular sizin aklınızda günde binlerce kez kurduğunuz şeylerin sadece 1 ve 0 lardan anlayan leyla bilgisayarınızın diline çevrilmesidir.
örneğin: kapı açık mı diye uzaktan bakarsınız, kapalıysa kapının kulbunu çevirirsiniz.

fakat bilgisayar dediğin alet biraz salaktır. kapının kapalı olduğunu uzaktan anlayamaz. onun yerine bir işlem yapması gerekir. bu da "if" (yani eğer) işlemidir. "eğer kapı kapalıysa kapının kulbunu çevir" derseniz salak bilgisayarımız anlayacaktır. diyelim bakalım:

if döngüsü
if ( kapı.kapalı == true ){
kapı.kulbucevir();
}

aynı kod aşağıdaki şekilde de yazılabilir.

if ( kapı.kapalı ){
kapı.kulbuçevir();
}

hatta tek satırlık kodlar için

if ( kapı.kapalı )
kapı.kulbuçevir();

şeklinde bile yazılabilir.

dikkat ettiyseniz iki satırda en önemli mantıksal sorgu olan if sorgusunu geçtik. burada asıl dikkat etmeniz gereken nokta syntax'tır (syntax: yazılımın yazım kuralları)

if ( neyi sorguluyacan ){
sorgu doğruysa ne yapılacak.
}

"if"in bir kardeşi varsa o da "else"tir. ingilizce bilenler anlamışlardır. else, if'in sorgu sonucu "false" dönerse ne yapılacağını belirler, "yoksa" anlamındadır. İki genel kullanımı vardır. birincisi yalnız kullanımı (else) ikincisi başka bir if cümlesiyle birlikte kullanımı (else if)

if ( kapı.kapalı )
kapı.kulbuçevir();
else
kapı.içindenGeç;

fakat daha yaygın olanı başka bir if cümlesiyle kullanılmasıdır. Kısmen genişletilmiş bir örnek şöyle olabilir:

if ( !kapı.var ) //hemen açıklama: "!" operatörü zıtlık belirtir. burada kapı.var değilse demek, yani kapı yoksa..
Console.WriteLine( "kapı yok ki" );
else if ( kapı.kapalı )
kapı.kulbuçevir();
else if ( kapı.açık )
kapı.içindenGeç;
else //yukarıdaki sorgulardan hiçbiri tutmazsa..
Console.WriteLine( "Böyle bir ihtimal yok." )


Bir sonraki örneğimiz iki kardeş döngü. For ve ForEach

For Döngüsü
Diyelim ki aynı kapının içinden beş kere geçmek istiyoruz (yani salağız). "Bunu beş kere yap" diyemeyiz bilgisayara. neden? çünkü bilgisayar salak.. o yüzden onu biraz kandırmamız lazım. "benim i adında 0 ile başlayacak bir sayım var. i 5'ten küçük ise söyleyeceklerimi yap. Her yaptığında da i'yi bir arttır.

for ( int i = 0; i < 5; i++ )
kapı.içindenGeç;

yeri gelmişken "++" operatöründen bahsedelim. "++" özel bir operatördür. hem önek operatörü hem sonek operatörü olabilir. (yaw ben süper isimlendirmeler yapıyorum. bu isimleri de şimdi uydurdum). yani i++ ya da ++i şeklinde kullanılabilir ve ikisi de i'nin değerini bir arttırır. Farkları ise bir örnekle anlatılabilir.

int i = 5;
Console.WriteLine ( i++ ); //konsolda 5 yazar. ama i'nin değeri 6 olur.
Console.WriteLine ( ++i ); //konsolda 6 yazar ve i'nin değeri 6 olur.

Yani biri önce işlemi yapar, biri önce değeri arttırır.


ForEach Döngüsü
Bu döngü for döngüsünün kardeşidir. Bir dizideki her nesne için birşeyler yapmayı sağlar. listeye kaydettiğiniz isimlerin sayısını istiyorsunuz.. Bunu yapmanın bir yolu da listedeki her isim için verdiğiniz int değişkeni bir arttırmaktır. örnekle açıklamak gerekirse:
said:
string[] isimler; //isimler adında string tipinde bir dizi tanımladık.
int i = 0;

isimler[0] = "Ali";
isimler[1] = "Veli";
isimler[2] = "Hasan";

foreach ( string isim in isimler[] ){
i++
}

Console.WriteLine ( i ); //konsolda 3 yazacaktır.
ne yaptığımızı tekrar anlatalım. isimler dizisinde ne aradığımızı belirtmek için önce bir değişken tanımladık ve nerede bakacağımızı belirledik. RunUO ile ilgili bir örnek şöyle olabilir:

foreach ( Item esya in World.Items.Values ){ //bu neyse artık...
i++
}


diğer çok önemli bir döngü de while döngüsüdür fakat buna RunUO içinde pek ihtiyaç duyacağınızı sanmadığım ve pek vaktim olmadığı için es geçiyorum..

Şimdi bir sonraki bölümümüze, hatalara geçelim.[signature][hline]its supersonic

[Bu mesaj MumChamber tarafından 14 February 2004 14:04 tarihinde değiştirilmiştir]
Mesaj tarihi:
[ Hatalar ]
Yazılımda üç tür hata olabilir. Bunlar yazım hatası (syntax error), çalışma zamanı hatası (RunTime Error) (olmayan bir nesneye erişmeye çalışmanız gibi), ya da mantıksal bir hata olabilir. (logical error) (bitmeyen bir döngü gibi) bu hatalardan en çok karşılaşacağınız RunTime error olacaktır. Aslında syntax error çok yapılsa bile derleyiciler eş zamanlı olarak bunu kontrol ettikleri için programı derlerken size hata dönmeyecektir. RunTime error dediğimiz hatalara karşı en büyük kozunuz try-catch bloğudur. bu blok önce bir şeyi dener, hata oluşursa sizin önceden istediğiniz şeyi yapar ve programı çökertmez.

try {
bunu yap
}
catch {
hata verirse bunu yap. //işlem geri alınabilecek gibiyse geri alınır.
}

Son tür hatamız ise mantıksal hatalardır. buna karşı yapılabilecek başka birşey de yoktur. mesela
for ( int i = 0; i > -1; i++ ) şeklinde başlayan bir for bloğu asla bitmez. çünkü i her zaman -1'den büyük olacaktır. zaten bu tür bir mantıksal hata yapıyorsanız çözümü yazılım değil algoritma ya da mantık konularında aramanız gerekir. çünkü yazılım ve algoritma oluşturmak ap ayrı iki konu...

Bir sonraki bölümümüz Metodlar olacak..[signature][hline]its supersonic
Mesaj tarihi:
[ Metodlar: Fonksiyon ve Prosedürler ]
her yazılım dilinde olduğu gibi C#'ta da metodlar mevcuttur. ve bunlar ikiye ayrılırlar: Prosedürler ve Fonksiyonlar. bunların temel farkları prosedürler geriye bir değer döndürmezler. bu da demektir ki tanımlanmalarında "void" içerirler. //void hakkında bu kadar bilseniz yetecektir.

metodlarda daha fazla ilerlemeden önce public, private gibi scope(tanım aralığı -daha güzel çevrilmiş birşey vardı da aklıma gelmedi) belirleyicileri bilmeniz gerekli. public -adından da anlaşılabileceği gibi- dışarıdan erişilebilir demek. yani farklı classlar, farklı nesneler bu metoda erişebilir. private ise sadece kendi classı içinde erişilebilir hale getirir. bunlardan bağımsız olarak static diye bir tanımlayıcıyla karşılaşabilirsiniz. bu da metodu "shared" hale getirir. yani kullanılması için yeni bir instance yaratılması gerekmez.. Galiba çok karıştırdım. örnekle açıklayayım. //silencer'ın örneğine benzer birşeyle açıklayayım.

diyelim ki şu şekilde bir kodumuz var:
said:

Public Class Cocuk{

//değişken tanımlama bölümü.
private string babaAdiDegiskeni = "Ahmet"
private string adiDegiskeni

public string Adi{

get{ return adiDegiskeni; } //Burada ne yapıldığını pek umursamayın şimdilik.

set{ adiDegiskeni = value; }
}

public static string BabaAdi{
return babaAdiDegiskeni;
}

}
ve dışarıdan müdahale etmek istiyoruz. yeni bir çocuk yaratmamız lazım;

Cocuk berk = new Cocuk();
berk.adi = "Berk"

şimdi bunları yaptık çünkü Adi metodu static değil. yani kendisini kopyalayacak her örnek, her instance için farklı değerler alabilir. bir çocuğun adı berk iken diğeri ali olabilir. ama biz bu programı kendimiz için yaptığımızdan hepsinin baba adı bizim adımız yani "Ahmet" olacak. bu arada aramızdaki ahmet kim? ben değilim. neyse karışmıştır. boşverin..
baba adı hiç değişmeyeceği için onu static olarak tanımladık. hatta o kadar static ki oratada bir çocuk olmasa bile Cocuk.BabaAdi diyerek istediğimiz yerden ulaşabileceğiz.

Ve genel olarak ulaşılabildiği için berk.BabaAdi diye bir erişim olmayacak. onun yerine Cocuk.BabaAdi diye ulaşmamız gerekli..[signature][hline]its supersonic

[Bu mesaj MumChamber tarafından 14 February 2004 14:08 tarihinde değiştirilmiştir]
Mesaj tarihi:
şimdilik hazırladıklarım bu kadar. bütün yazıyı hazırlamam 2,5 saat gibi birşey sürmüş. bu yüzden bazı noktaları atlamış ya da hata yapmış olabilirim.. yakın zamanda gaza gelirsem RunUO Guide #3 hazırlamayı düşünüyorum. gerçi bu aşamadan sonra guide hazırlamak anlamsız olur. örnek kod da yayınlayabilirim. ya da örnek kod ağırlıklı bir guide olur... //gördüğünüz gibi bu konuda kendimle çelişiyorum.. yani ne yapacağım belli olmaz..

herkese kolay gelsin, bol RunUO'lu günler :)[signature][hline]its supersonic
Mesaj tarihi:
kitap verin derken ben kitaptan çalışmıyorum. eskiden bir kitabım vardı onu da Ractalgar(Ractamainus) aldı..

kitap olarak ben bir kitabı tavsiye etmem, o sorumluluğu almam çünkü kitaplar genel olarak birbirinden kötü. yabancı kitaplar çok iyi olmasına karşın tercüme eden arkadaşlar çok komik hale getiriyorlar. (namespace için "ad alanı" yazanlar neyse de "ad uzayı" yazan var ya..)

türkçe kitaplar ise nedense orjinallik ve bilgi yüklülükten yoksun.. çünkü kimse kendi alanında kitap yazmıyor. dikkat ederseniz vb kitabı yazan adam hemen arkasından C# ve SQL hakkında da kitap yazıyor. bu demektir ki uzman yok.

yabancı kitaplar arasında genelde microsoft'ta o dilin geliştirilmesinde çalışmış insanların kitapları bilgi dolu oluyor. fakat okunabilirlik konusunda pek birşey söyleyemeyeceğim..

bu yazıdan çıkarılacak sonuç: eğer bir kitaptan çalışmak istiyorsanız girin alkım'a. C#'la ilgili size hitap eden bir kitap alın. (yani "yeni başlayanlar için", "C/C++'tan geçiş için" yazdığından emin olun..)[signature][hline]its supersonic
Mesaj tarihi:
namespace'i isimuzayı diye çeviren bir kitabım var. ilk başta bana da çok komik geldi. Sonra bir saat düşündüm dedim bunun adı bu olur şu olur , isimkapsamı , isimbölümü, isimtanımı vs vs sonra birden isimevreni gibi bir şey saçmaladım.

Aslında düşününce çok çok yanlış diyemiyorum. Bazen Türkçe çeviri bize garip gelse de doğru oluyor.

Alakasız, evet evet çok alakasız biliyorum ama gördüğüm en iyi çeviriyi söylemek istiyorum

Usual Suspects -> Olağan şüpheli.
Sözlükten bakınca ilk olarak olağan çıkıyor ama sokakta sorsanız heralde olağandışı tüm kelimeleri sayardım size...[signature][hline]Silencer
Mesaj tarihi:
tercüme konusunda yukarı tükürsen bıyık, aşağı tükürsen sakal..

fakat türkçe bir yazılım dilimiz olmadığı için terimleri tercüme etmesek daha güzel olur gibi.. class için "sınıf", public için "genel" dendiğinde koda dönünce genel Sınıf CevapYaz şeklinde bir tanımlama yapamayınca çok garip oluyor..

türkçe anlamları bilinmeli, hiç bilmeyene türkçe anlatılmalı fakat terminolojisi bozulmamalı..[signature][hline]its supersonic
  • 3 ay sonra ...
Mesaj tarihi:
Böyle bi yazı gerekiyodu çok iyi olmuş ellerine sağlık.[signature][hline]If she comes back its never finished, if she doesnt, it has never happened..

TheCoder, 05 Haziran 2004 22:19 tarihinde demiş ki:
sen gel bana freeze verme sana resci önünde serverı kuyruğa sokayım...


Who is that ?
Mesaj tarihi:
ufak iki hatırlatma, array declerationda uzunlugunu vermeden indexlere ulaşmaya kalkma runtime hatası alırsın.
bir de classlarda constructor yazman lazım..
Mesaj tarihi:
classlar constructorsız (empty constructor) da çalışır da arraylerde atlamışım o bölümü

string[] isimler = new string[5] şeklinde tanımlanması gerekli?
fakat çoğu zaman performans birinci kriterim olmadığı için HashTable ve ArrayList daha kullanışlı geliyor bana.[signature][hline]en ince yerim bileğim..
Mesaj tarihi:
eheh :) haklısın. ben de constructorda birşeyler yapmak lazım diyorsun sandıydm. :)

derleyici olarak sharp develop da güzel visualstudio.net de güzel. ikisini de kullandım, şu anda vs.net kullanıyorum. sharp develop'un renkleri hoşuma gitmedi :P[signature][hline]en ince yerim bileğim..
  • 7 ay sonra ...
×
×
  • Yeni Oluştur...