www.muhendisiz.net class IlkKod { public static void main() { Console.WriteLine("Bir Sonraki Yazida Gorusmek Uzere"); } } C YE GİRİŞ (1)



Benzer belgeler
YZM 2105 Nesneye Yönelik Programlama

BİL-142 Bilgisayar Programlama II

Operator Aşırı Yükleme (Operator OverLoading)

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

HSancak Nesne Tabanlı Programlama I Ders Notları

Ders 8: Metotlar. barisgokce.com

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Programlama Dilleri 3

C#(Sharp) Programlama Dili

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Lambda İfadeleri (Lambda Expressions)

Programlama Dilleri 3

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

C# nedir,.net Framework nedir?

HSancak Nesne Tabanlı Programlama I Ders Notları

Öğr. Gör. Musa AYDIN Fatih Sultan Mehmet Vakıf Üniversitesi

Sunum İçeriği. Programlamaya Giriş

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

public static int Toplam int x, int y

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

NESNEYE YÖNELİK PROGRAMLAMA

BMH-303 Nesneye Yönelik Programlama

BİL-142 Bilgisayar Programlama II

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

4. Bölüm Programlamaya Giriş

11- FONKSİYONLAR (FUNCTIONS)

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

YZM 2105 Nesneye Yönelik Programlama

MVC. Görüldüğü üzere 2 adet cs. Dosyası oluşturdum. Birincisi çok satır kodu (20-25) içeren büyük işlerin yapılacağı class. İsmi buyuk_isler.

Genel Programlama II

HSancak Nesne Tabanlı Programlama I Ders Notları

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

Programlama Dilleri III 1

BİLG Dr. Mustafa T. Babagil 1

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

PROGRAMLAMAYA GİRİŞ DERS 2

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Göstericiler (Pointers)

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

C++ Dersi: Nesne Tabanlı Programlama

Hafta 13 Fonksiyonlar

BTEP243 Ders 3. class Yazım Kuralı:

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

NESNEYE YÖNELİK PROGRAMLAMA

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Diziler İndisli Değişkenler

Nesne Tabanlı Programlama

Nesne Yönelimli Programlama

// hataları işaret eden referans

Dr. Fatih AY Tel: fatihay@fatihay.net

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

Konular. Hafta 5 Veri Tipleri (Devam) BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

if (ad == "Sabri") Console.WriteLine("Merhaba Sabri. Ne zamandır gözükmüyodun...");

2.2- DEĞİŞKENLER VE SABİTLER ÇALIŞMA YAPRAĞI

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

«BM364» Veritabanı Uygulamaları

Pointer Kavramı. Veri Yapıları

/*int sayi1, sayi2,toplam=0;

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

Java String İşlemleri

Nesne Tabanlı Programlama

Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi

C++ Dersi: Nesne Tabanlı Programlama

Nesne Tabanlı Programlama

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Veri Tipleri Aşağıdaki programdaki 5 hatayı bulunuz.

C# Çalışma Örnekleri

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Diziler (Arrays) Çok Boyutlu Diziler

Özyineleme (Recursion)

Görsel Programlama 1

10/17/2007 Nesneye Yonelik Programlama 3.1

Bahar. BM 211 Programlama Dilleri 3 1

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Programlama Dilleri 3

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Yrd. Doç. Dr. Caner ÖZCAN

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Programlama Dillerinde Kullanılan Veri Tipleri

Öğr. Gör. Serkan AKSU 1

JAVADA DİZİ İŞLEMLERİ

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

2. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Transkript:

C YE GİRİŞ (1) C# Bölümünden herkese merhaba. Bundan böyle düzenli olarak bu bölümde temelden başlamak suretiyle C# ile ilgili bilgiler vermeye çalışacağım. Amacımız belli bir konu sırası ile mümkün olduğunca sık güncelleyerek bu bölümü size aktif olarak sunabilmek. Her neyse lafı daha fazla uzatmadan ilk makalemize başlıyalım. Yazılım teknolojilerini takip edenler eminim C# ismini uzun bir süre önce duymaya başlamışlardır. Peki nedir bu C#? Microsoft'un geliştirdiği ve yine Microsoft'a göre Windows İşletim sisteminden sonra BT sektöründeki en büyük gelişme olan ve yatırımlarının %80' nini bu çalışmalara ayırdığı.net 'in bir parçası. Yada şöyle diyelim..net'in resmi dili. Dinamik sayfalar ile birlikte internet üzerindeki web siteleri programlanabilir ekranlar halini aldı. Bu sayfaları asp,php gibi bir takım dillerle hazırlıyabiliyorduk. Özellikle JAVA ile birlikte daha kompleks, daha ciddi servisler hazırlanabilir hale gelmişti. İşte bu noktada Microsoft tarafında.net Framework Beta Piyasaya sürüldü. (Şu anda benim kullandığım Beta2 versiyonu) Farklı modüllerden meydana gelen bu ürünün bir parçasınıda C# oluşturdu. C# haricinde Visual Studio.NET aracılığı ile, gelişmiş başka diller ilede bu servisler geliştirilebilir. Örneğin Dünya üzerinde en çok bilindiği ve kullanıldığı söylenen VBasic yada çok güçlü bir dil olan C++. Peki madem öyleyse niye C#. Nedeni şu; C#.NET Framework ile sıfırdan yaratılmış bir dil. Dolayısıyla.Net'in bütün özellikleri ile uyumlu çalışabiliyor. Ayrıca tam anlamıyla Object Oriented bir dil. Nesneye yönelik programlamanın getirdiği bütün avantajları bünyesinde barındırıyor. Temelde Syntax'ı Java'ya çok benziyor. C++ ve Java ile uğraşanların bu dile kolayca adapte olacağını düşünüyorum. Ben bu sayfalarda hazırladığım kodları Visual Studio.NET' ile hazırlıyorum. Eğer sizin böyle bir imkanınız yok ise Microsoft'un sitesinden Framework SDK yı indirerek(yanlız yanılmıyorsam 110 MB civarı.) bu uygulamaları gerçekleştirebilirsiniz. C# ile ilgili bu kısa ön bilginin üzerine yine kısa bir kod ile bu makalemize burada son verelim. class IlkKod public static void main() Console.WriteLine("Bir Sonraki Yazida Gorusmek Uzere");

Boran 1

C DEĞİŞKEN VE METHOD TANIMLARI (2) Bu makalemizde C#' ta değişken ve method tanımlama işlemleri üzerinde duracağız. Değişken tiplerini tanıyıp kullanım şekillerine baktıktan sonra Method tanımlama yöntemlerini inceleyeceğiz. Ardından değişkenlerin kullanım yerlerine göre oluşturduğu farklılıkları inceleyerek yazımıza son vereceğiz. DEĞİŞKEN TANIMLAMA -Aşağıdaki satırda integer tipte bir değişken tanımlanıyor ve değişkenin adı belirtiliyor. -İkinci satırda ise tip ve değişkenin ardından initializasyon işlemi gerçekleştiriliyor. int i; //Değişken Tipi ve Değişkenin Adı veya int i=0; //Değişken Tipi - Değişkenin Adı - Değeri -Aynı işlem string tipte bir değişken içinde tekrarlanabilir. string ad; //Değişken Tipi ve Değişkenin Adı string ad="ahmet"; //Değişken Tipi - Değişkenin Adı - Değeri Burada bir hatırlatma C#' ta büyük küçük harf ayrımı vardır. Yani; string ad; ile string Ad; farklı değişkenlerdir. Ayrıca her satırdan sonra (Method ve Koşul tanımlanan satırlar hariç) noktalı virgül konulmalıdır. Şimdide bazı değişken tiplerinin özelliklerine bir bakalım. Tipi Uzunluğu Boyutu Byte 0-255 8 Bit integer Char - 16 Bit character Double- 15-16 digits Float - 7 digits int -2.147.483.648 ile 2.147.483.647 arasında 32 Bit integer long 9.223.372.036.854.775.808 ile 64 Bit 9.223.372.036.854.775.807 integer short -32.768 ile 32.767 arasında 16 Bit integer METHOD TANIMLAMA İşe bir önceki makalede yazdığımız örnekle başlıyalım. class IlkKod public static void main() Console.WriteLine("Bir Sonraki Yazida Gorusmek Uzere");

Boran 2

public static void main() satırına bakacak olursak. Burada bir method tanımlama söz konusu. Yanlız bu main() isimli özel bir method. Tıpkı C ve JAVA' da olduğu gibi. Biraz açıklayacak olursak eğer her hangi bir uygulamada main() isimli bir method varsa ilk önce o icra edilir. Yani uygulama ilk önce bu method içindeki işlemleri yaparak çalışmaya başlar. class Test public static void main() Console.WriteLine("Bir Sonraki Yazida Gorusmek Uzere"); public void EkranaBas() Console.WriteLine("Bu Mesajı Göremiyeceksiniz.") Bu yeni kodumuzda ise, Test isimli class' ımıza EkranaBas() isimli yeni bir method ekledik. Bu method içinde, ekranda göstermesi amacıyla Console.WriteLine özelliğini kullanarak bir mesaj yazdık.yanlız bu mesajın içeriğine dikkat ederseniz mesajın ekrana basılmayacağını görebilirsiniz. Bunun nedeni methodun çağırılmaması. Bu kod icra edildiğinde sadece main methodu içinde belirtilen mesaj ekrana basılacaktır. Şimdi Yukarıdaki kodu biraz daha genişletelim. class Test public static void main() Console.WriteLine("Bir Sonraki Yazida Gorusmek Uzere"); Test baglan = new Test(); baglan.ekranabas(); public void EkranaBas() Console.WriteLine("Mesajı Artık Görebilirsiniz.") private void Deneme() Console.WriteLine("AspNedir.com") Evet new keyword'u aracılığı ile Test class'ına ait bir baglan nesnesi oluşturduk ve EkranaBas() methodunu çağırdık. Yanlız burada Deneme() isimli bir method daha var. EkranaBas ile Deneme isimli iki method'a biraz dikkat edicek olursak tanımlama esnasında farklılıklarının olduğunu görebiliriz. EkranaBas methodu public ile başlarken Deneme methodu private ile başlıyor. Aradaki fark: PUBLIC: public ile başlıyan methodlar dışarıdan (yani başka bir class'ın içinden) çağırılabilir. PRIVATE: private ile başlıyan methodlar ise sadece bulunduğu class içinde çağırılabilir. Eğer bu iki kavram kafanızı karıştırdıysa çok üzerinde durmayın. Bir sonraki makalede

Boran 3

daha ayrıntılı bir şekilde açıklamaya çalışacağım. Şimdi birazda değişkenlerin method lar içinde nasıl kullanıldıklarına ve nasıl sonuçlar verdiklerine bakalım. class Test string yer="class değişkeni"; public static void main() string yer="method değişkeni"; Console.WriteLine(yer); Test baglan = new Test(); baglan.ekranabas(); public void EkranaBas() Console.WriteLine(yer); Bu uygulamada yer değişkeni string tipinde olup iki farklı yerde tanımlanarak yine iki farklı yerde içeriği ekrana basılmaktadır. Şimdi; method içinde tanımlanan değişken sadece o method içinde geçerlidir. Yani main methodu içindeki mesajda ekrana Method Değişkeni yazılacaktır. Ancak EkranaBas() method'unda ise ekrana Class Değişkeni mesajı çıkacaktır.bunun nedeni EkranaBas methodu içinde yer diye bir değişken tanımlı olmadığı için derleyici bu değişkeni gidip class'ın altında arıyacaktır. Bu yazımızda yukarıdaki sorulara cevap arıyacağız. Konuyu kavrıyabilmeniz açısından bir önceki makaleyi ("C#'da Değişken ve Method Tanımlamak") okumanızı tavsiye ederim. FONKSİYONLAR (3) class AspNedir public static void main() AspNedir baglan = new AspNedir();//baglan nesnesi oluşturuluyor. int donendeger = baglan.carp();//baglan nesnesi aracılığı ile Carp Fonksiyonu çağırılıyor. Console.WriteLine(donendeger);//Sonuç ekrana Basılıyor public int Carp() int sayi1 = 2; int sayi2 = 7; int sonuc = sayi1*sayi2; return sonuc;//sonuc değişkeninin içeriği kendisini çağırana döndürülüyor.

Boran 4

İlk fonksiyon örneğimizi bitirdik. Şimdi kodumuzu bir inceleyelim. Carp() isimli fonksiyon, public ve integer tipte. Yani bu fonksiyon dışarıdan çağırılabilir ve kendisini çağıran Method yada Fonksiyona integer tipinde bir değer döndürür. Bu döndürme işleminide return ifadesiyle yaparız. Bu örneğe göre fonksiyonun kısa bir tanımını yapacak olursak. Fonksiyon: Eğer yazdığımız kod bloğu geriye bir değer döndürüyorsa fonksiyondur. Döndürmüyor ise fonksiyon değil Method' dur. class AspNedir public static void main() AspNedir baglan = new AspNedir(); int donendeger = baglan.carp(3,7); Console.WriteLine(donendeger); public int Carp(int sayi1, int sayi2) int sonuc = sayi1*sayi2; return sonuc; Yukarıdaki örnekte görüldüğü gibi dilersek bir Fonksiyona dışarıdan değer gönderip, bu değerleri işlemesini sağlıyabiliriz. ARRAY'LER class AspNedir public static void main() int[] myarray=1,2,3; Console.WriteLine(myArray[0]); Console.WriteLine(myArray[1]); Console.WriteLine(myArray[2]); Yukarıdaki örnekte integer tipte bir dizi tanımlayarak değer atamalarını yaptım. Aşağıdaki örnekte ise bu sefer iki boyutlu olan yine integer tipte bir array tanımladım ve For döngüsünü kullanarak dizinin değerlerini atadım. using System; public class Merhaba int[,] myarray; // İki boyutlu bir dizi tanımladık. public static void Main() Merhaba baglan = new Merhaba();

Boran 5

baglan.ekranabas(); public void EkranaBas() myarray = new int[3,3]; // Dizinin Sınırlarını Belirledik // For döngüleri ile dizi elemanlarının içeriğini girip ekrana basıyoruz. for(int i=0 ; i<=3 ; i++) for(int j=0 ; j<=i ; j++) myarray[i,j] = i+j; Console.WriteLine("myArray[0,1]= 2",i,j,myArray[i,j]); Dilersek bir dizinin sınırlarını dinamik olarakta belirliyebiliriz. Tek yapmamız gereken dizinin sınırlarının oluşturulduğu fonksiyon tarafından dışarıdan değer olarak almasını sağlamak. public void EkranaBas(int row, int col) myarray = new int[row,col]; for(int i=0 ; i<=row ; i++) for(int j=0 ; j<=col ; j++) myarray[i,j] = i+j; Console.WriteLine("myArray[0,1]= 2",i,j,myArray[i,j]); Evet bu makalemizde fonksiyon ve array'leri inceledik. Bir daha ki makalemizde C# Statement'larını inceleyeceğiz. Aslında bu ifadelerden biri olan For Statement'ını bu makalemizde gördük sayılır.

Boran 6

C# C SHARP A GENEL BAKIS C# Windows uygulamaları geliştirmek için C++ ve Visual Basic programlama dillerine alternatif olarak Visual Studio.NET ile birlikte gündeme gelen bir uygulama geliştime dilidir. C#, bize Visual Studio da yalnızca C++ ile erişebildiğimiz yerlere ulaşabilmemizin yanısıra Visual Basic kadar kolay bir kullanım sağlar. Özellikle.NET için geliştirildiğinden.net kod yapısına en uygun dil olarak bakabiliriz C# a. Bu nedenle C#,.NET framework ünü daha kolay ve daha etkin kullanır. Orta seviye bir programla dili olması ise Visual Basic ve C++ ın en iyi özelliklerini içermesini ve tam bir OOP (Object Oriented Programming) ortamı sunmasını sağlar. C# ı.net framework ünden ayrı olarak incelemek yerine bütünün bir parçası olarak ele almak gerekir. Çünkü.NET ile geliştirilen CLR (Common Language Runtime JVM[Java Virtual Machine] e benzeyen ve birbirinden farklı dillerin IL(Intermediate Language) e compile edilerek oratak çalışmasını sağlayan yapı olarak tanımlayabiliriz),.net kodlarının ortak çalışmasına izin vermektedir. Bu şu anlama gelir ister C#, ister C++, ister Visual Basic, uygulamamızı hangi platformda yazarsak yazalım çatımız hep aynıdır..net, genel amaçlı yazılmış windows platformu programlarında bir devrimdir..net in sağladığı birçok avantaj vardır; kullanımı kolay nesne modellemesi, Garbage Collection ı sayesinde yaratılan kaynakların otomatik olarak temizlenmesi, SQL ve ADO spesifik Data Access, ASP.NET sayfalarının oluşturulmasına yarayan geliştirilmiş library ler ve bunlar gibi birçok yapı. Ancak; her ortam için o ortamın özelliklerine ulaşmak elbette belirli mekanizmalar gerektirir. Örnek verecek olursak Windows, C ve C++ da yazılmış bir dil olduğundan yönetim yine C,C++ kodundan ulaşabildiğimiz Windows API ile sağlanır (Bu, Visual Basic in Windows API nin bütün özelliklerine kolay erişim sağlayamamasının nedenidir). C# ın gerçek faydası burada ön plana çıkmaktadır, C#.NET framework ü için sıfırdan başlanarak tasarlanmış ve bu dilin yazım ve dil özellikleri.net in sunduğu kolaylıklardan basit bir şekilde yararlanabilmesi için geliştirilmiştir. Bir örnek verecek olursak; System.String.NET class library sinde bir class tır ve case convertion ları, substring lerin ayıklanması ve string ifadelerin trim lenmesi gibi bir çok method a sahiptir. C# compiler ı bu class ı otomatik olarak tanıyan kendi string keyword üne sahiptir.

Boran 7

string MyStr1= Visual ; string MyStr2= Studio ; string MyStr3=.net ; string MyStr4=MyStr1+ +MyStr2+ +MyStr3; MyStr4.ToUpper(); //Sonuç olarak MyStr4 e VISUAL STUDIO.NET değeri atanır..net framework ü, kullanılan kaynakları boşaltmakta çok başarılıdır. Bu başarının sırrı ise managed code içerisindeki değişkenlerin stack yerine managed heap de tutulmasıdır. C# bu gibi işlemleri bizim yerimize otomatik olarak yapmaktadır. Tabiiki.NET platformunda Managed C++ ve VB.NET de aynı özelliklerden C# gibi faydalanabilmektedir. Bu yapının sağlanabilmesi ise Visual Basic ve C++ ın yapısında gerçekleştirilen bir takım değişikliklerle mümkün olmuştur. Bu da Visual Basic ve C++ açısından bakıldığında bir upgrade anlamına gelmektedir. Yapıları ne kadar upgrade edildiyse de yeni bir platform için VB ve C ye geçmişten gelen yazılım geliştirme dilleri olarak bakmak yerinde olacaktır. Bu iki dil bu anlamda.net platformunda yazılım geliştirirken geçmişten gelen alışkanlık ve syntax yapıları yüzünden tam anlamıyla.net için dizayn edilmemişlerdir; bu da yazılım geliştirirken C# a göre bu yazılım geliştirme dillerini dezavantajlı hale getirir. Hatta bu yüzden VB.NET syntax ının hala tam anlamıyla Object Oriented Programming e göre dizayn edilmediği tartışmasını ortaya çıkarmıştır. C# ise karşımıza tertemiz bir defter yaprağı gibi çıkmaktadır. Bunun nedeni ise Microsoft un C# ı tam anlamıyla.net çizgisine göre geliştirmiş olmasıdır. Object Oriented Programming için gerekli syntax dizaynı ve program yazmayı kolaylaştıran yapısı C# ı.net framework ünde çalışmak için mükemmel bir dil haline getirmiştir. C# tam anlamıyla bir Object Oriented Programming dilidir. Bu özellik ise sadece C# ın taşıdığı bir özellik değil tabiiki. C++ ta Object Oriented Programming yapısına sahiptir hatta VB bile Object Oriented olarak tanımlanmıştır. Buna rağmen C++ ve VB açısından olaya yaklaştığımızda birtakım problemlerle karşılarız. C++ ı ele aldığımızda karşımıza tam anlamıyla Object Oriented Programming için geliştirilmiş ve dizayn edilmiş bir programlama dili çıkar ancak geliştirildiği zamanlarda Object Oriented Programming yapısında kodun yeniden kullanımı gibi bir düşünce yoktu. Klasik C++ kodu bütün dilleri desteklemez ve klasik C++ ın çalışabilmesi için, inherit edeceğiniz class ın orijinal source undan class header larına ulaşmanız gerekmektedir.

Boran 8

Daha sonraları COM sayesinde dil uyumluluğu sağlandı ve programlama dilleri (VB,VJ++,C ve C++) çok basit bir şekilde COM objesi olarak yazılan classlara ulaşabildiler. Ancak COM öğrenmesi çok zor bir yapı olması dezavantajını hep taşıdı ve tam anlamıyla klasik Object Oriented Programlama yolunda inheritence ı destekleyemedi. Diğer bir yandan VB COM yazma platformu sağlayan ve COM un karmaşık yapısını uygulama geliştirenlerden gizleyen bir yapıya sahiptir. Ancak çoğu Object Oriented Programming uzmanının da söylediği gibi VB gerçek anlamda OOP modeline sahip değildir çünkü inheritence ı desteklemez. C# ise her iki dünyanın avantajlarını bize sunmaktadır. Tam anlamıyla inheritence ı destekler fakat bunun yanısıra.net framework ü source dosyalarımıza ulaşmadan inheritence sağlayabilmek için compile edilmiş durumda bulunan library dosyalarını (assembly) sağlar. Bu sayede.netprogramcılık tarihinde ilk kez programlama dilleri arasında çapraz geçişlere izin veren ve gerçek anlamda bir yeniden kullanım olanağı sağlayan bir platform olmuştur. Inheritence bir class ın içerisinde başka class ları base almamızı sağlayan Object Oriented Programming modelin bir özelliğidir. Örneğin standart olarak kullandığınız bir menu,toolbar ve statusbar yapısı var, bir form üzerinde ilgili standartlarınızı yerleştirdiniz, başka bir formda da aynı özellikleri kullanmak istediğinizde tek yapmanız gereken oluşturduğunuz ilk formu base almak ve yeni formunuza inherit etmek. Yeni formunuz inherit ettiğiniz formun bütün özelliklerini içeren yeni bir form olarak karşımıza çıkacaktır. Development tarafından baktığımızda bu işlem bize zaman kazandıran ve yeniden kullanım imkanı sağlayan bir yapıdır. C# orta seviye bir programlama dilidir. Bir sıralama yapacak olursak C# ın bu sıralamadaki yeri aşağıdaki gibi olacaktır. Assembly o C,C++ C#,J++ Visual Basic o VBA, Scripting Dilleri

Boran 9

Listemizde yukarıdan aşağıya doğru inecek olursak aşağıya indikçe dillerin öğrenimi kolaylaşır.daha az kod yazarak ve daha az zaman harcayarak istediğimiz projeleri gerçekleştirebiliriz. Assembly ile yazılım geliştiriyorsak hiç alışık olmadığımız bir performansla karşılaşırız ancak assembly öğrenmesi, yazılım geliştirmesi en zor platformlardan birisidir. Bu nedenle assembly dili ile yazılmış programlar genellikle çok yüksek performansın ön planda olması gereken bazı device driver lar, oyun subroutine leri ve işletim sistemlerinin temel dosyalarıdır (win.com gibi). C++ ise GUI (Graphical User Interface) geliştirmek için tercih edilmesi gereken bir dildir. Eğer daha basit bir şekilde GUI ler geliştirmek istiyorsak tercihimiz tabiiki Visual Basic olmalıdır. GUI lerde performans ön planda değildir çünkü burada limit faktörü kullanıcıdadır yani kullanıcının mouse ı hızlı tıklamasındadır!.. C#, Visual Basic ile C++ arasında bulunan boşluğu gidermek için dizayn edilmiştir. C#, C++ ile yazılabilen ve yazılırken C++ kadar zor olmayan aynı zamanda Visual Basic ten daha yüksekte program yazmak isteyen yazılımcıları hedef almıştır. C++ ve VB arasındaki boşluğu dolduran ve pek tatmin edici olmayan J++ bu durumuna rağmen C# ile birçok yönden benzerlik göstemektedir. C#, C++ ın syntax ına çok benzeyen bir syntax a sahiptir ve C++ ın birçok özelliğini destekler örneğin inheritence (multiple olmamasına rağmen). Bu nedenle C++ programcıları C# ı çok kolay bir şekilde öğrenebileceklerdir. Visual Basic programcıları kendilerini yepyeni bir syntax ve birçok object oriented kavramı ile karşı karşıya bulacaklardır ancak C# ı öğrenmek, C++ ı öğrenmekten çok daha kolaydır. C# ın C++ ve Visual Basic arasında bir dil olduğuna iyi bir örnek olarak memory management gösterilebilir. Visual Basic deki tek memory management şudur: nesnelerle işiniz bittiğinde set nesne=nothing demeniz yeterlidir, bunu yapmayı unutursanız olacak tek kötü şey sistem kaynakları ve memory nin gerektiğinden biraz daha uzun bir süre kullanılması olacaktır. Diğer taraftan, C++ developer lara hangi değişkenin hafızada ne kadar kalacağının ayarını yapma imkanı vermek ve böylelikle hafızanın daha etkin kullanımını sağlamakla kalmaz, bunu nerdeyse zorunlu kılar. C++ da yazılmış programların memory management bug larına maruz kalmaları ve hafızada kayıplara yol açması Visual Basic de gerçekleşmez. C# memory management ta Visual Basic in yolunu izler, yani sorumluluk dilin kendisindedir. Ancak VB nin aksine C# da memory yi kendiniz sınıflandırmak isterseniz yazdığınız kodun bir bölümünü unsafe olarak belirtebilir ve sonra da C++ da olduğu gibi Memory için yer ayırıp daha sonra bu kısmı boşaltabilirsiniz.

Boran 10

Şu ana kadar bahsettiklerimizi değerlendirecek olursak Microsoft un.net platformuna uygun olarak ürettiği C# a Visual Basic yada C++ dilleri ile uygulama geliştiren developerların aynı çatı altında toplanacağı bir yapı olarak bakabiliriz. Daha az zaman harcayarak, daha az kod yazarak daha güçlü applikasyonlar geliştirmek için C# mükemmel bir platform gibi gözüküyor. C# ile tanışmak ve çalışmak gerçekten heyecan verici. İyi ki doğdun C#. Temel Programlama ve C# (1) Value Tipleri ve Tanımlanması Value tipleri için C#, C ve C++ programcılarının seveceği bir tanımlama syntax ına sahiptir. Anlaşırlılık sağlamak amacıyla her tanımlama için bir statement kullanılabilir veya alternatif olarak aynı anda birden fazla tanımlama yapılabilir. int i; // Basit Tanımlama // Bileşik tanımlama int i,j,k; Tek yada bileşik tanımlamalar sırasında değişkenlere başlangıç değerleri de atanabilir. // Basit bir tanımalama ve initializasyon int i=5; //Bileşik bir tanımlama ve initializasyon int x=3,y=8,z=-1; C# aynı zamanda C ve C++ gibi for ve loop döngülerinin başlangıcında değişken tanımlama ve initializasyona izin verir. for (int j=0;j<5;j++) C# memory buglarını önlemek amacıyla tanımladığınız değişkenin bir değer atamasına tabi tutulup tutulmadığını compile sırasında inceler. Bu işlem sayesinde atanan bu değerin işletim sistemi tarafından programınızın akışı sırasında memoryden release edilmesi engellenmiş olur.

Boran 11

using System; public class ForcedInit public static int Main() int k; Console.WriteLine(k); return 0; Yukarıdaki kodu compile ettiğimizde bir compiler hatası ile karşılarız: use unassigned local variable k. Programı hatasız bir şekilde derleyebilmek için k değişkenini initializasyona tabi tutmamız gerekir. using System; public class ForcedInit public static int Main() int k=0; //k değişkeni tanımlandı ve initialize edildi Console.WriteLine(k); return 0; Bu kodu compile ettiğimizde ise herhangi bir hata ile karşılaşmayız çünkü k değişkeni tanımlanmış ve aynı zamanda initializasyona işleminden geçmiştir yani bir başlagıç değeri almıştır. Referans Tipleri ve Tanımlanması Referans tiplerinin bir instance ının yaratılması sırasında new keyword ü kullanılır. new keyword ü kullanıldığında C# referans tipinin bir instance ını heap de yaratır ve ilgili instance ın referans değerini döndürür; bu sayede geri dönen referansı bir değişkende tutabiliriz. using System; public class ReferenceType public int MyData; public class SimpleClass public static int Main() ReferenceType obja;

Boran 12

//new keyword'ü kullanılarak ReferenceType instantiate ediliyor obja=new ReferenceType(); obja.mydata=5; return 0; Aynı objeye birden fazla farklı referans atamak mümkündür. using System; public class ReferenceType public int MyData; public class SimpleClass public static int Main() ReferenceType obja; ReferenceType objb; ReferenceType objc; obja=new ReferenceType(); obja.mydata=5; //Aşağıdaki kod ile obja'nın aynı instance referansını //objb ve objc'ninde almasını sağlarız. objb=obja; objc=obja; return 0; Bir objeye referans verildiğinde referans ı destroy etmek için referans ın tanımladığı nesneye null değeri atamak yeterlidir. Bu önemli bir işlemdir çünkü Common Language Runtime (CLR) ile yönetilen Garbage Collector (GC) ilgili nesneyi otomatik olarak memory den release etmek yani işini yapabilmek için bunu bilmek zorundadır. using System; public class ReferenceType public int MyData; public class SimpleClass public static int Main() ReferenceType obja;

Boran 13

//new keyword'ü kullanılarak ReferenceType instantiate ediliyor obja=new ReferenceType(); //Aşağıdaki kod ise ilgili objeyi Garbage Collector(GC)'i //kullanarak memoryden de-allocate etmek için hazırlıyor. obja=null; return 0; Periyodik olarak GC (Garbage Collector) referans ına null değeri atanmış objeleri tespit eder ve onların otomatik olarak memory den de-allocate edilmesini sağlar. Değişken Tipleri ve Dönüşümleri Program buglarını ortadan kaldırmak için (bug-free programs) C# çok güçlü typed bir dildir. Değişkenler arasındaki dönüşümler sadece ihtiyaç duyulduklarında kullanılmalıdır. Örnek verecek olursak bool tanımlı bir değişkeni string değişken tipindeki bir değere dönüştürmek için bunu belirtmeniz gerekmektedir. Bu sayede program otomatik olarak değişken tiplerini convert etmekle uğraşmayacaktır, bu da programın daha hızlı çalışmasını sağlayacaktır. using System; public class Donusum public static int Main() bool MyBool=true; string i,j; i=mybool; MyBool=false; j=mybool; Console.WriteLine(i); Console.WriteLine(j); Console.ReadLine(); return 0; Yukarıdaki kodu compile ettiğimizde bir hata ile karşılarız: Cannot implicitly convert type bool to string.

Boran 14

Programın düzgün olarak çalışabilmesi için bool değişken tipinin.tostring() metodu kullanılarak ilgili çevrimin belirtilmesi gerekmektedir. using System; public class Donusum public static int Main() bool MyBool; string i,j; MyBool=true; i=mybool.tostring(); MyBool=false; j=mybool.tostring(); Console.WriteLine(i); Console.WriteLine(j); Console.ReadLine(); return 0; Boxing ve Unboxing Value ve referans tipleri arasında dönüşümler mümkündür. Stack te tutulan bir value tipinin heap de tutulan bir referans tipine dönüştürülmesi işlemine boxing, heap de tutulan bir referans tipinin stack te tutulan bir value tipine dönüştürülmesi işlemine ise unboxing adı verilir. using System; public class BoxingExample public static int Main() object obja; int i,j; //i stack'te tutulan value tipinde bir değişkendir. i=10; //Bu işlem ile i'ye heap'de bir referans değeri atanır (boxing) obja=(object)i;

Boran 15

//Bu işlem ise referans değerini stack'de tutulan //bir value değerine atar (unboxing) j=(int)obja; Console.WriteLine(j); Console.ReadLine(); return 0; Unboxing işlemi sırasında heapde tutulan referans tipinin değerinin stack de tutulan value tipinin değeri ile uyumlu olmasına dikkat etmek gerekmektedir. Aşağıdaki örnekte int değerini byte değerine unbox ederek bir runtime hatası oluşmasına neden olunmuştur. Boxing ve unboxing işlemleri ile ilgili birtakım alıştırma kodları yazmak bu tip işlemlerin anlaşılması açısından faydalı olacaktır. using System; public class BoxingExample public static int Main() int i=10; object obja; byte j; obja=(object)i; j=(byte)obja; Console.WriteLine(j); Console.ReadLine(); return 0; Array ler C# array ler için bize yeni bir syntax sunmaktadır.array tanımlaması sırasında köşeli parantezler kullanılır ve tanımlama işlemi sırasında değerler atanabilir. using System; public class ArrayExample public static int Main() //Aşağıdaki işlem array tanımını ve //değer atamasını gerçekleştirir. int[] aryint=1,2,3;

Boran 16

return 0; Bu yöntem ile 2,3 ve çok boyutlu arrayler tanımlanabilir. using System; public class ArrayExample public static int Main() //Aşağıdaki işlem 2D bir array tanımını ve //değer atamasını gerçekleştirir. int[,] aryint= 1,2,3, 4,5,6, 7,8,9 ; return 0; Alternatif olarak new keyword ü ile dimension ı daha sonra belirtilmek üzere bir array tanımlanabilir. protected bool[,] MyBool; İstenildiği takdirde array dinamik olarak da oluşturulabilir. Aşağıdaki örnekte array ilgili class ın constructor ına eklenerek class yaratıldığında dimension ı dinamik olarak tanımlanan bir dizi yaratılması sağlanmıştır. using System; public class Arrays private int MaxCols; private int MaxRows; private bool[,] MyBool; public Arrays(int Rows, int Cols) MaxCols=Cols; MaxRows=Rows; MyBool=new bool[rows,cols]; public class ArrayExample public static int Main()

Boran 17

Arrays MyArray=new Arrays(1,2); return 0; C# aynı zaman orthogonal (dikey) ve jagged (çapraz her rowda farklı eleman sayısına sahip diziler) array tanımlamalarına izin verir. Aşağıdaki örnek 1.rowunda 1, 2.rowunda 2, 3. rowunda 3 elemana sahip bir diagonal matris (yatay) tanımı yapacaktır. using System; public class ArrayExample public static int Main() int[][] ary=new int[3][]; ary[0]=new int[1]; ary[1]=new int[2]; ary[2]=new int[3]; ary[0][0]=1; ary[1][0]=2; ary[1][1]=3; ary[2][0]=4; ary[2][1]=5; ary[2][2]=6; for (int i=0;i<=2;i++) for (int j=0;j<=i;j++) Console.Write(ary[i][j].ToString()+" "); Console.WriteLine(); Console.ReadLine(); return 0; Bütün C# array leri System.Array tipinden inherit edilir ve bu bize birçok avantaj sunar. Aşağıdaki örnekte System.Array class ının birkaç method unu ve avantajlarını görüyoruz. using System; public class ArrayExample public static int Main() int[] ary=7,3,9; //Aşağıdaki kod tanım sırası ile değerleri

Boran 18

Enumeration //ekrana yazdırır foreach (int j in ary) Console.Write(j.ToString()+" "); Console.WriteLine(); //Aşağıdaki kod Matris'i ters çevirir Array.Reverse(ary); foreach (int j in ary) Console.Write(j.ToString()+" "); Console.WriteLine(); //Aşağıdaki kod ise dizi elemanlarını sıralar Array.Sort(ary); foreach (int j in ary) Console.Write(j.ToString()+" "); Console.ReadLine(); return 0; Enumarationlar kişiye özel integer tiplerdir. Enumaration tanımlandığında tanımlanan tipin alabileceği değerler belirlenmiş olur. Enumarationlar ile geliştirdiğimiz class ın içerisine istenmeyen değerlerin programcı tarafından assign edilmesini engeller ve intellisense özelliği ile programcıya kullanılabilecek parametrelerin değerlerini göstermeden programın kolay kullanımını sağlarız. using System; public class EnumerationExample enum Renkler Siyah,Beyaz,Kirmizi,Mavi; public static int Main() Renkler[] j=renkler.beyaz,renkler.kirmizi,renkler.mavi,renkler. Siyah; for (int i=0;i<4;i++) Console.WriteLine(j[i]); Console.ReadLine();

Boran 19

Constant return 0; Program içerisinde hiç değişmeyecek değerler kullanmak istediğimizde sabitler yani constant kullanılır. Constant tanımlama aynı zamanda client programcılarına kullanabilecekleri limitleri göstermek açısından da faydalı olabilir. abstract public class Deneme public const int MaxRows=50; public const int MaxCols=100; C# ta Program Akış Kontrol Mekanizmaları Data tipleri hakkında birçok noktaya değindikten sonra şimdi de akış kontrol mekanizmalarına göz atabiliriz. Fonksiyonlar Fonksiyonlar programın akışı sırasında en çok başvurduğumuz yapılardır. Fonksiyon kullanmanın nedenlerini 3 şekilde açıklayabiliriz: Yeniden kullanım, Çok fazla değişen fonksiyonelliği sağlamak, Kodun ne yaptığını anlatmaya yardımcı olmak. Fonksiyon Tanımlama Bir fonksiyon matematikte olduğu gibi geriye her zaman bir değer döndürür. Bu tanımdan yola çıkarak tanımlayacağımız fonksiyonun ne tip değer döndüreceğini de söylememiz gerekmektedir. Aynı zamanda fonksiyonlar ın içerisine yine tipi belli değerler parametere olarak gönderilebilir. Geriye döndürdüğümüz değeri ise return statement ı ile compiler a belirtiriz. Eğer geriye bir parameter göndermek istemiyorsak o zaman kullanmış olduğumuz yapı fonksiyon değil bir metoddur. Bir class içerisinde tanımlı bir fonksiyonu class içerisinden instance ını yaratmadan kullanabilmek için static keyword ünü kullanırız. Aşağıdaki örnek static bir fonksiyon tanımlayarak içeriye gönderilen iki parametreden büyük olanını geriye döndürmektedir. public static int Max(int value1, int value2) int ReturnValue; if (value1>value2)

Boran 20

ReturnValue=value1; else ReturnValue=value2; return ReturnValue; Fonksiyonu Aktif Hale Getirmek Fonksiyonun aktif hale getirilebilmesi için fonksiyon adından sonra parantezler ve hemen ardından içeriye gönderilecek parametreler belirtilir ve parantez kapatılır. Aşağıdaki örnek ile yukarıda yazılan Max fonksiyonun kullanımı görülmektedir. using System; public class FunctionExample public static int Max(int value1, int value2) int ReturnValue; if (value1>value2) ReturnValue=value1; else ReturnValue=value2; return ReturnValue; public static int Main() int k; k=max(1,5); Console.WriteLine(k); Console.ReadLine(); return 0; Fonksiyonlar ve Parametreler C# ta fonksiyon kullanımı sırasında value tipler value referans tipler ise referans olarak fonksiyon içerisine geçer. Bu pratik olarak şu demektir fonksiyonun içerisine gönderilen değer parametrenin bir kopyasıdır ve değer üzerinde yapılan herhangi bir değişiklik parametrede bir değişikliğe yol açmaz. Bunu bir örnekle açıklamak yerinde olacaktır.

Boran 21

using System; public class ByValSample //void deyimi ile geriye parametre döndürmeyeceğimiz //yani kullanılan fonksiyonun bir metod gibi davranacağını //belirtiyoruz. public static void ChangeValue(int y) y=20; return; public static int Main() int x=10; Console.WriteLine("Metod çağrılmadan önce x="+x); ChangeValue(x); Console.WriteLine("Metod Çağrıldıktan Sonra x="+x); Console.ReadLine(); return 0; Eğer C# ın bu davranışını değiştirmek istersek yani fonksiyona parametre olarak gönderilen değer üzerinde yapılan herhangi bir değişikliğin aynı zamanda değişkene de yansımasını istiyorsak parametre tanımında geçişin referans olarak yapıldığını belirtmek zorundayız. Bu sayede parametrede yapılan bir değişiklik fonksiyona gönderilen değişkene yansıyacaktır. Bu işlemi gerçekleştirirken tek dikkat etmemiz gereken şey fonksiyona gönderilen parametrenin bir değere sahip olması yani kullanılmadan önce initialize edilmesi gerekliliğidir. using System; public class RefSample //ref keyword'ü ile parametrenin referans olarak //işlem göreceğini belirtiyoruz. public static void ChangeValue(ref int y) y=20; return; public static int Main() int x=10; Console.WriteLine("Metod çağrılmadan önce x="+x);

Boran 22

//İçeriye gönderilen parametrenin referans olarak //geçmesini sağlıyoruz. ChangeValue(ref x); Console.WriteLine("Metod Çağrıldıktan Sonra x="+x); Console.ReadLine(); return 0; Eğer initialize (değeri henüz atanmamış) olmayan bir değer fonksiyona göndereceksek aynı zamanda gönderilen değerin ilgili initialization işlemine tabi tutulması gerektiğini belirtmek zorundayız bunu yapmak için ise out keyword ü kullanılmaktadır. Aşağıdaki örnek bu yöntem ile referanssal bir geçiş sağlamaktadır. using System; public class OutSample public static void ChangeValue(out int y) y=20; return; public static int Main() int x; ChangeValue(out x); Console.WriteLine("Metod Çağrıldıktan Sonra x="+x); Console.ReadLine(); return 0; Diğer bir keyword ise içeriye gönderilecek kaç tane parametre olacağının bilinmediği durumlarda kullanılmak üzere geliştirilmiş params keyword üdür. Bu sayede fonksiyon içerisine n tane parametre gönderilebilir. Aşağıdaki örnek içeriye gönderilen n parametreden en küçük olanı bulmaktadır. using System; public class ParamExample

Boran 23

public static int FindMinimum(params int[] values) int intmin=-1; //.Length ile fonksiyona herhangi bir //parametre gönderilip gönderilmediğini anlıyoruz. if (values.length>0) intmin=values[0]; for (int i=1;i<values.length;i++) if (values[i]<intmin) intmin=values[i]; return intmin; public static int Main() int j,k; //j değişkenine 2 değerden küçük olanı atanıyor. j=findminimum(5,4); //k değişkenine FindMinimum fonksiyonuna 12 tane //parametre gönderilerek gönderilenlerin en küçüğü //atanıyor k=findminimum(5,4,1,-1,-8,1000,34,100,1000,10001,- 100,1); Console.WriteLine(j); Console.WriteLine(k); Console.ReadLine(); return 0;

Boran 24

Namespace, Value ve Referans Type'ların Kullanımı Namespaces Diğer.Net dilleri gibi C# ta.net base class library sinde tanımlanmış datatype ları kullanır. Bu classlar namespace adı altında gruplanmıştır. Namespace e diğer bir tanımlama ile classları kullanırken fonksiyonel bir şekilde ulaşmamızı sağlayan logic containerlar diyebiliriz. Örnek olarak System.Winforms namespace i Winform applikasyonları için gerekli kontrol ve classları içerir. Genellikle namespace deki ilk kelime class ın geliştirildiği organizasyonun adı olur. Farklı bir vendor un verdiği isimlerle aynı programda kullanıldığında herhangi bir olası isim benzerliğini engellemek içinse namespacelerde genellikle uzun tanımlamalar kullanılır. namespace Netron.Otomasyon.OtomasyonClasses //class tanımlamaları using keyword ü ile de namespaceler içerisinde bulunan classları çalışmamıza çekeriz. namespace using keyword ü ile çekildikten sonra artık herhangi bir period belirtmeden namespace içerisinde bulunan tanımlamalara ulaşabiliriz. using Netron.Otomasyon.OtomasyonClasses; using keyword ü ile compile işlemi sırasında modüller arasında herhangi bir link tanımlamış olmayız. using keyword ü ile ilgili ilginç bir şey ise onu alias type tanımlamak için kullanabilmemiz. Aşağıdaki örnek System.Int32 type ını MyInteger adıyla kullanmamızı sağlar. using MyInteger=System.Int32; public class AliasOrnek public static MyInteger Main() MyInteger i=1; MyInteger j=i+1; System.Console.WriteLine(j); return 0;

Boran 25

System Namespace Common Laguage Specification (CLS) bir programlama dili tarafından desteklenmesi kaçınılmaz olan bir çok datatype ı tanımlayan zengin bir library e sahiptir. Bu libraryde bulunan Boolean, string, integer, kronolojik ve finansal valueların hepsi System namespace inin içerisinde yer alır. Bütün typelar object type ından inherit edilir. Böylece bir object in referansı herhangi bir tipdeki değişkeni tutmak için kullanılabilir. Long type ın bit olarak büyüklüğü 64 e çıkarılmıştır. Bu sayede Whistler ve XP platformlarında 64 bitlik programlar için bir hazırlık sağlanmıştır. (64 bitlik olan bu işletim sistemleri Intel in yeni nesil 64 bitlik işlemcisi Itanium uyumludur) Value ve Referans Tipleri.NET dilleri tarafından kullanılan yada yaratılan her class value ve referans tipleri olarak kategorilendirilebilir. Value ve referans tipleri iki karakteristikle farklılık gösterir : hafızada tutuldukları yerler ve atama işlemi contextlerindeki davranışları. Value tipler stackte tutulur, her iki value değeri için yapılmış atama işlemi ile hafızada birbirinin kopyası iki bölüm oluşturulur. Referans tipler ise heap de tutulur. Her iki referans değeri için yapılmış atama işlemi ile memory deki tek bir yere iki ayrı referans oluşturulur. Aşağıdaki kod ile iki value değerine atama yapılmakta ve hafızada iki değer kopyası oluşturulmaktadır. (kodu derleyip çalıştırmak için /unsafe switch ini kullanın) using System; public class Simpleclass public static int Main() int i; int j; i=5; j=i; Console.WriteLine("i="+i); Console.WriteLine("j="+j); unsafe if (&i==&j)

Boran 26

Console.WriteLine("i ve j'nin adresleri aynı"); else Console.WriteLine("i ve j'nin adresleri farklı"); Console.ReadLine(); return 0; Bu kod ise iki referans değerine atama yapmakta ve hafızadaki tek kopyaya ulaşmaktadır. using System; public class ReferenceType public int MyValue; public class SimpleClass public static int Main() ReferenceType i; ReferenceType j; i=new ReferenceType(); i.myvalue=5; j=i; Console.WriteLine("i.MyValue="+i.MyValue); Console.WriteLine("j.MyValue="+j.MyValue); unsafe if (i==j) Console.WriteLine("i ve j aynı adreste"); else Console.WriteLine("i ve j farklı adreste"); Console.ReadLine(); return 0;

Boran 27

Primitives olarak adlandırılan pek çok değişken tipi C# da value tipi olarak kabul edilir : integer value tipi gibi. Aynı zamanda struct ile tanımlamanan user tipler de value tipinde tanımlamalardır. Instance Constructrolar Constructor lar objeleri initialize ettiğimizde devreye giren özel metodlardır. Eğer obje class ı içerisinde bir constructor tanımlı değilse bile compiler tarafından otomatik olarak boş bir constructor sağlanır. Bir objenin yaratılması işlemi iki aşamada gerçekleşir: Birinci aşamada obje için memory de alokasyon gerçekleştirilir. Her obje new operator ü kullanarak yaratılır. Bu kural için herhangi bir exception yoktur. Bunu explicit olarak kod içerisinde gerçekleştirebiliriz, yada compiler bunu otomatik olarak yerine getirir. int[] MyIntArray=1,2,3,4; int[] MyIntArray1=new int[4]1,2,3,4; Yukarıdaki deklarasyonlar ın her ikiside aynı işi yapmaktadır. Bir objenin yaratılmasındaki ikinci aşamada ise constructor çağrımıdır. Constructor new ile allocate edilen memory i obje ye çevirir. İki tip constructor ın varlığından bahsedebiliriz: static ve instance. Instance constructor lar objelerin initialize ı için kullanırlırlar. Static constructor lar ise class ların initialize ı için kullanılırlar. C++ da initialize işlemi gerçekleştirmeden new operator ü memory allokasyonu ve yine new keyword ü ile daha önceden allocate edilmiş memory i initalize etmek mümkündür. Bu ayrım C# da mümkün değildir. Bu yöntem ile C# memory deki yapı

Boran 28

okunmadan önce doğru değere atanma yapılmasını garanti etmiş olur. Default constructor class ile aynı isimdedir, geriye bir değer döndürmez ve bir metod değildir (void). Default constructor ın herhangi bir parametresi yoktur. İstenildiği takdir de parametrik constructor lar tanımlanılabilir. Constructor aynı zamanda implicit olarak static olmayan alanları initialize işlemine tabi tutar. int, double, decimal gibi nümerik alanlar 0 a, bool alanlar false a Referans tipler null a, Struct ların içerdiği alanların hepsi yukarıdaki yapıya uygun olarak initialize işlemine tabi tutulurlar. Default constructor ın bu işlmeleri yapmasının iyi yanlarının yanı sıra dezavantajlı yanlarıda vardır: Mesela bir tarih class ın da yıl, ay ve gün değerlerinin 0 dan başlamasını istemeyiz. Böyle durumda kendi constructor ımızı tanımlamamız gerekmektedir. Aşağıdaki örnekte default constructor kullanan bir class ve kullanımı görülmektedir. using System; class Tarih public short Gun,Ay,Yil; class Class1

Boran 29

[STAThread] static void Main(string[] args) Tarih a=new Tarih(); Console.WriteLine("Yıl:0",a.Yil); Console.WriteLine("Ay:0",a.Ay); Console.WriteLine("gün:0",a.Gun); Console.ReadLine(); Bu class ı test ettiğimizde Ay, Gun ve Yıl değerlerinin 0 a set edildiği rahatlıkla görülmektedir. Default constructor ı devre dışı bırakıp kendi constructor ımızı yazmak istersek kodumuz aşağıdaki şekilde olacaktır: using System; class Tarih public short Gun,Ay,Yil; public Tarih() Gun=1; Ay=1; Yil=1970;

Boran 30

class Class1 [STAThread] static void Main(string[] args) Tarih a=new Tarih(); Console.WriteLine("Yıl:0",a.Yil); Console.WriteLine("Ay:0",a.Ay); Console.WriteLine("gün:0",a.Gun); Console.ReadLine(); Bu kod çalıştığında ise 1.1.1970 tarihi ile karşılaşırız. Default constructor ve kendi oluşturduğumuz constructor arasındaki fark açık bir şekilde görülmektedir. Constructor lar tıpkı metod larda olduğu gibi overload edilebilirler. Bu sayede class ımızın farklı initialization işlemlerine tabi tutulması sağlanılabilir. Overload etme işlemi gayet basittir. Class ile aynı isimde ve diğer constructor dan farklı parametreler kabul eden bir tanım vererek bunu sağlayabiliriz. Az önce gördüğümüz örnekteki constructor ı overload edecek olursak:

Boran 31

using System; class Tarih public short Gun,Ay,Yil; public Tarih() Gun=1; Ay=1; Yil=1970; public Tarih(short Day,short Month,short Year) Gun=Day; Ay=Month; Yil=Year; class Class1 [STAThread] static void Main(string[] args) Tarih a=new Tarih(); Tarih b=new Tarih(2,2,2002);

Boran 32

Console.WriteLine("a.Yıl:0",a.Yil); Console.WriteLine("a.Ay:0",a.Ay); Console.WriteLine("a.Gün:0",a.Gun); Console.WriteLine("b.Yıl:0",b.Yil); Console.WriteLine("b.Ay:0",b.Ay); Console.WriteLine("b.Gün:0",b.Gun); Console.ReadLine(); Görüldüğü gibi a ile ilgili olan tarih 1.1.1970 iken b ile ilgili olan tarih parametrik olarak ikinci constructor a yönlendiği için 2.2.2002 tarihini elde etmiş oluruz. Dikkat ettiyseniz birinci constructor içerisinde de ikincisine benzer bir işlem yaptık; basit bir assignment işlemi. Her seferinde aynı kodu yazmaktansa diğer bir yöntem ile işimizi biraz daha kolaylaştırabiliriz birinci constructor çağrıldığında onu ikinci constructor a yönlendirebiliriz: using System; class Tarih public short Gun,Ay,Yil; public Tarih():this(1,1,1970) public Tarih(short Day,short Month,short Year)

Boran 33

Gun=Day; Ay=Month; Yil=Year; class Class1 [STAThread] static void Main(string[] args) Tarih a=new Tarih(); Tarih b=new Tarih(2,2,2002); Console.WriteLine("a.Yıl:0",a.Yil); Console.WriteLine("a.Ay:0",a.Ay); Console.WriteLine("a.Gün:0",a.Gun); Console.WriteLine("b.Yıl:0",b.Yil); Console.WriteLine("b.Ay:0",b.Ay); Console.WriteLine("b.Gün:0",b.Gun); Console.ReadLine(); Birinci constructor da yaptığımız :this(1,1,1970) yönlendirmesi ile üç parametre kabul eden ikinci constructor ı çağırmış olduk. Bu yönteme initializer list adı verilmektedir. Bu

Boran 34

noktada bilmemiz gereken bir kural ise bir initializer list içerisinde tanımlı metod un kendi kendini çağıramamasıdır. Class içerisinde bazen readonly değişkenler kullanmak istiyebiliriz. Yani değeri bir kere assign edildikten sonra kullanıcı tarafından değiştirilmesini istemediğimiz değişkenler. Bu şekildeki değişkenler class içerisinde aşağıdaki şekilde tanımlanılabilirler: public readonly int MinYil=0; Bu tanımlama ile sonradan değiştirilemeyecek bir değer ataması yapmış oluruz. Fakat bazı durumlarda bu değerin class ın yaratımı içerisinde değişmesini isteyebiliriz. Mesela class içerisinde bir array imiz var ve initialization sırasında bu array in Max range inin belirlenmesini istiyoruz. Bu durumda bir şekilde kullanıcıya readonly olan bu değere bir kereye mahsus bir assignment şansı vermek zorundayız. Bu gibi durumlarda ise constructor ları kullanmak zorunda kalırız. Bir örnekle bakacak olursak: using System; class MyArray public readonly int MaxRangeOfArray; public int[] MyArr; public MyArray(int MaxRange) MaxRangeOfArray=MaxRange;

Boran 35

public void CreateArray() MyArr=new int[maxrangeofarray]; class Class1 [STAThread] static void Main(string[] args) MyArray a=new MyArray(1); a.createarray(); a.myarr[1]=2; Console.ReadLine(); MaxRangeOfArray değişkenine yapmış olduğumuz atama sadece constructor içerisinde gerçekleşebilir. Constructor dışında herhangi bir metod içerisinde bu değişkene yapılacak atama compiler ın hata vermesine neden olacaktır. CONSTRUCTORS using System; class AspNedir public int number=3; public AspNedir() // Constructor Methodumuz number = 5;

Boran 36

public void setnumber(int newnumber) number = newnumber; public int getnumber() return number; Konumuza direkt örnek bir kod yazarak başladım. İncelersek eğer şimdiye kadar ki makalelerimiz de tanımladığımız methodlara hiçte benzemiyen bir method tanımlaması yaptığımızı görebilirsiniz. AspNedir() isimli bu methodumuzun iki önemli özelliği var. İlki adının class'ımızın adı ile aynı olması. Diğeri ise herhangi bir return değerinin olmayışı. Bildiğiniz gibi methodları tanımlarken return tiplerini de belirtmek zorundaydık. Method eğer herhangi bir değer döndürmeyecekse return tipini void olarak belirtiyorduk. Ancak burada sözü geçen methodumuz için bunların hiç birisi geçerli değil. Class ile aynı adı taşıyan ve herhangi bir return değeri olmayan methodlara Constructor Methodlar diyoruz. Herhangi bir class'ı çağırdığımızda ilk önce o class'a ait constructor çalışır. Dolayısıyla, eğer her hangi bir işlemin class ilk çağırıldığında yapılmasını istiyorsak bu işlemleri constructor içinde veya constructor tarafından tetiklenen başka bir method içinde yapabiliriz.bu yöntemini genelde class'a ait bir takım değişkenlerin değerlerini set etmek için kullanırız. Şimdi yukarıda ki class'ımızı çağıracak olan methodumuzu yazalım. public static void Main() AspNedir test = new AspNedir(); Console.WriteLine(test.getNumber()); Console.ReadLine(); Burada methodun döndüreceği değer 5 olucak. Daha önce belirttiğim gibi her hangi bir class'ı çağırdığımızda ilk önce o class'ın Constructor methodu çalıştırılır. Örneğimizde ki constructor' da number değişkenini set ederek değerini beş'e eşitliyor. Yukarıda, herhangi bir class'ı çağırdığımızda ilk önce constructor'ın çalışmaya başladığını belirttik. Peki eğer çağırılan class'ın herhangi bir constructor'ı yoksa ne olucak,örneğin daha önce hazırladığım makalelerde ki örneklerin hiç birinde constructor methodunu yazmamıştım. Aslına bakarsanız her class'ın default bir constructor methodu vardır ve boştur. Yani demin ki örneği baz alırsak; public AspNedir() // Default Constructor Methodu Constructor'ımıza dışarıdan değer de gönderebiliriz. Şöyle ki; using System;

Boran 37

class AspNedir public int number; public AspNedir(int newnumber) // Dışarıdan değer alan Constructor Methodumuz number = newnumber; public int getnumber() return number; Dışarıdan değer alan Constructor'ı ise şu şekil de çağırabiliriz. public static void Main() AspNedir test = new AspNedir(12); Console.WriteLine(test.getNumber()); Console.ReadLine(); Dilersek aynı class için de birden fazla constructor tanımlıyabiliriz. Yukarıda ki örneklerde de gördüğünüz gibi constructor' lar her hangi bir isim ile tanımlanmadıklarından derleyici hangi constructor'ın çağırıldığını methodun dışarıdan aldığı parametrelere göre ayırır. Aynı işlem method ve fonksiyonlar için de geçerlidir. Buna Overloading denir. Şimdi bu kavramı inceliyelim. OVERLOAD KAVRAMI İsimleri aynı ancak dışarıdan aldığı parametrelerin pirimitiv tipleri farklı olan iki ayrı method yada fonksiyon tanımlama işlemine Overloading denir. Bir örnek vericek olursak. using System; class AspNedir public static void Main() AspNedir test = new AspNedir(); Console.WriteLine(test.TestMethod("İlk Methodu Çağırıyorum")); Console.WriteLine(test.TestMethod(6)); Console.ReadLine(); public String TestMethod(String newmesaj) String mesaj = "String deger alan Methodhodu çağırdınız =" + newmesaj; return mesaj; public String TestMethod(int sayi) String mesaj = "Integer deger alan Methodhodu çağırdınız =" + sayi; return mesaj; Görüldüğü gibi iki methodun da isimleri ve return tipleri aynı olmasına rağmen dışarıdan aldığı parametre tipleri

Boran 38

farklı olduğu için istediğimiz methodu yada fonksiyonu çağırabildik. Aynı işlemi yukarıda anlattığım constructor'lar için de gerçekleştirebiliriz. OVERWRITE KAVRAMI Bazen daha önce programın herhangi bir yerinde tanımlamış olduğumuz bir method yada değişkeni ezmek isteriz. Yani aynı tipte ve özelliklerde bir method yada değişken daha yaratarak ilk önce yaratılanın etkisiz kalmasını sağlıyabiliriz. Tabi bu bilerek yapılabileceği gibi dikatsizlik sonucu istenmeden de gerçekleşebilecek bir olay. Bu makalemizde şimdilik sadece değişkenleri overwrite etme üzerin de duracağız. using System; class AspNedir public int deger = 7; public int testmethod() int deger = 3; return deger; public static void Main() int deger = 5; AspNedir test = new AspNedir(); Console.WriteLine("Değişkenin testmethod Değeri ="+test.testmethod()); Console.WriteLine("Değişkenin Main Fonksiyonuna Ait Değeri ="+deger); Console.WriteLine("Değişkenin Class Değeri ="+test.deger); Console.ReadLine(); Yukarıda ki örnekte görüldüğü gibi integer tipteki "deger" değişkeni aynı uygulama içinde farklı bloklarda üç kere tanımlanmasına rağmen hata vermedi. Bir değişkenin değerini ekrana basmaya kaltığımız zaman, değer ilk önce bulunulan blok içinde aranır. O blok içinde eğer tanımlı böyle bir değişken varsa değeri ekrana basılır. Aksi taktirde Class seviyesine çıkılarak istenen değişkene bakılır. Yoksa uygulama zaten böyle bir değişken tanımlı değil diye hata vericektir.

Boran 39

C#' ta IO (Girdi/Çıktı) İŞLEMLERİ Bilgisayarımızın sürücüleri, dosya ve klasör yapıları ile ilgili gerekli bilgileri almamızı yada herhangi bir text dosyası yaratma,içine bilgi girişi yada içindeki bilgileri okuyabilmemizi sağlıyan işlemlere IO (input/output) işlemleri diyoruz. Yukarıda saydığım işlemleri yapabilmemizi sağlıyacak olan gerekli class ve methodlar.net geliştirme ortamında System.IO namespace 'i içinde yer alır. Dosya ve klasörler üzerinde işlem yapmamızı sağlıyan dört sınıf vardır. Bunlar; Directory DirectoryInfo File FileInfo Directory ve File Sınıfları yeni bir klasör yada dosya yaratma-silme işlemlerinizi yaparken,directoryinfo ve FileInfo ise adından da anlaşılacağı gibi daha çok, ilgili klasör yada dosya hakkında çeşitli bilgileri almanızı sağlıyacak olan sınıflardır. using System; using System.IO;//System.IO namespace'i namespace AspNedir public class systemio public static void Main() //Driver Listesi Diziye Atılıyor. string[] suruculer = Directory.GetLogicalDrives(); foreach (string liste in suruculer) Console.WriteLine("surucu=0",liste); //İstediğim Herhangi Bir Dosyaya En Son Ne Zaman //Erişildiğini de File Sınıfının GetLastAccessTime //Methodu ile Öğrenebilirim. string d=(file.getlastaccesstime(@"c:\aspnedir.txt")).tostring(); Console.WriteLine (d); Console.Read(); Örnekte Directory sınıfının GetLogicalDrives ve File Sınıfının GetLastAccess methodlarını gördük. Directory ve File Sınıfının diğer bazı özelliklerine bakacak olursak. File Directory AppendText() Copy Create Delete Exist CreateDirectory Delete Exist Move GetDirectories