c# akademi 2005

665

Click here to load reader

Upload: burak-selim-senyurt

Post on 27-May-2015

994 views

Category:

Education


7 download

TRANSCRIPT

Page 1: C# Akademi 2005

1 (http://www.csharpnedir.com)

.NET Framework ve C#’a Giriş

C# Akademi

Page 2: C# Akademi 2005

2 (http://www.csharpnedir.com)

Tarihçe

C Dili ve Yapısal ProgramlamaC Dili ve Yapısal Programlama C++ ve Nesne Yönelimli ProgramlamaC++ ve Nesne Yönelimli Programlama

Java’nın DoğuşuJava’nın Doğuşu

İnternetin Gelişimiİnternetin Gelişimi ..ve C#’ın doğuşu..ve C#’ın doğuşu

Page 3: C# Akademi 2005

3 (http://www.csharpnedir.com)

Neden C# Öğrenilmesi kolay Nesne yönelime tam destek Yüksek verim Güç ve kolaylık arasındaki denge XML desteği Yönetilemeyen kod yazma desteği Olay tabanlı programlamaya tam destek C# modern bir dil.

SONUÇ : C# güzel bir dildir

Page 4: C# Akademi 2005

4 (http://www.csharpnedir.com)

Neler yapabiliriz ? Konsol Uygulamaları Windows form tabanlı uygulamalar ASP.NET ile Web formları Web servisleri Mobil uygulamalar Windows servisleri DLL(!) geliştirme

Page 5: C# Akademi 2005

5 (http://www.csharpnedir.com)

Web sitWeb sitee

Web siteWeb site

Web siteWeb site

ArkaplanArkaplanUyg.Uyg.

Mega Mega ServisServis

ArkaplanArkaplanUyg.Uyg.

MegaMegaSServiservis

.NET ne işe yarar ?

Page 6: C# Akademi 2005

6 (http://www.csharpnedir.com)

Eski zorluklar neler ?

Bir çok geliştirme ortamı var (COM,MFC,ATL,VB,VC++)

COM’un zorlukları DLL Cehennemi Kurulum zorlukları.Register

zorunluluğu

Page 7: C# Akademi 2005

7 (http://www.csharpnedir.com)

.NET in tasarım amacı

DLL cehenneminden kurtuluş. Kolay kurulum - XCOPY COM Modelinin tasarım zorluğunu

aşma Daha hızlı ve kolay geliştirme modeli XML ve SOAP ile web servislerine

kolay erişim desteği Interneti daha iyi programlama ve

cihazdan bağımsız geliştirme yapabilme beceresi

Platform ve dil bağımsızlığı

Page 8: C# Akademi 2005

8 (http://www.csharpnedir.com)

.NET Framework Bileşenleri

İki ana bileşen

FCL – Framework Class Library

CLR – Common Language Runtime

Page 9: C# Akademi 2005

9 (http://www.csharpnedir.com)

.NET Framework

Temel Sınıf KütüphanesiTemel Sınıf Kütüphanesi

CLS StandartlarıCLS Standartları

CLR - CLR - Common Language RuntimeCommon Language Runtime

ADO.NET: Data ADO.NET: Data veve XML XML

VBVB C++C++ C#C#V

isual S

tud

io.N

ET

Visu

al Stu

dio

.NE

T

ASP.NET: Web ServiASP.NET: Web Servisisiveve Web Form Web Formlarıları

JScriptJScript ……

WindowsWindowsFormsForms

WindowsWindowsFormFormlarıları

Page 10: C# Akademi 2005

10 (http://www.csharpnedir.com)

CLR : Çalışma Modeli

VBVBKaynakKaynak kodkod

DerleyiciDerleyici

C++C++C#C#

DerleyiciDerleyiciDerleyiciDerleyici

AssemblyAssemblyIL IL KoduKodu

AssemblyAssemblyIL IL KoduKodu

AssemblyAssemblyIL IL KoduKodu

İşletim Sistemi Servisleriİşletim Sistemi Servisleri

CLR - CLR - Common Language RuntimeCommon Language Runtime

JIT JIT DerleyicisDerleyicis

Doğal(Doğal(NativeNative)) KodKod

AraArakodkod

YönetilmeyenYönetilmeyenBileşenlerBileşenler

Page 11: C# Akademi 2005

11 (http://www.csharpnedir.com)

Özetle .NET Derleme Modeli

kod.cskod.cs csc.execsc.exe IL(aradil)IL(aradil)

JITJIT

X86 X86 Makine Makine KoduKodu

KODKOD

METADATAMETADATA

İlk derlemeden sonraki İlk derlemeden sonraki derlemeler ön bellekten derlemeler ön bellekten okunacağı için hız artacaktır.okunacağı için hız artacaktır.

CLRCLRUygulamaUygulama

Page 12: C# Akademi 2005

12 (http://www.csharpnedir.com)

.NET Framework kütüphanesi

Unified Classes

Web Classes (ASP.NET)

XML Classes

System Classes

Drawing Classes

Windows FormsData (ADO.NET)

Controls, Caching, Security, Session, Configuration etc

Collections, Diagnostics, Globalization, IO, Security,Threading Serialization, Reflection, Messaging etc

ADO, SQL,Types etc

Drawing, Imaging, Text, etc

Design, Cmpnt Model etc

XSLT, Path, Serialization etc

Kaynak : MSDN

NYP tasarım modeli ve hiyerarşik yapıdaki kütüphane

Page 13: C# Akademi 2005

13 (http://www.csharpnedir.com)

Bazı kütüphaneler Namespace(isim alanları) System System.Collections System.IO System.Windows.Forms System.Net System.Threading System.Xml System.Data System.Reflection

...

...

Page 14: C# Akademi 2005

14 (http://www.csharpnedir.com)

CLR – Common Language Runtime JIT derleyicileri ile anında derleme Hafıza(memory) ve kanal(thread )yönetimi IL’e derleme ve çalıştırma Çoklu CPU desteği için optimizasyonlar ILDasm.exe – Önemli bir araç Managed Code (CLR nin çalıştırdığı kod) Ngen.exe utility (Doğal koda dönüştürme

aracı – Intel 8086-)

Page 15: C# Akademi 2005

15 (http://www.csharpnedir.com)

Yönetilen Kodda neler var? EXE kodu PE formatındadır Yönetilen EXE de bulunanlar:

1. PE Başlığı

2. CLR Başlığı

3. Metadata Projedeki bütün türler Tür güvenliği garantisi Referans sayımı.(GC)

4. IL Kodu

MSCOREE.dll sistem DLL inde bulunan _CorExeMain fonksiyonu ile IL kodu çalıştırılır

*Portable Executable

Page 16: C# Akademi 2005

16 (http://www.csharpnedir.com)

Çöp toplama – Garbage Collection

Siz hiçbir zaman çöp toplamaya layık biri değilsiniz? .NET arkanızda bıraktığınız çöpleri sizin yerinize toplar!

Page 17: C# Akademi 2005

17 (http://www.csharpnedir.com)

CTS – Common Type System

Sınıflar ve Yapılar. Veri türlerindeki elemanlar

Field(Alan) Metod Property(Özellik) Event(Olay)

Bütün türlerin atası:System.Object

Page 18: C# Akademi 2005

18 (http://www.csharpnedir.com)

Türler Referans ve değer türleri Reference türleri heap’te saklanır Değer tipleri stack’te saklanır Bütün türler System.Objects’ten

türetilmiştir İki veri türü arasında dönüşüm

yapabilir. Burak bey anlatacak.

GC ile referans sayımı yapılır.

C# tipi Boyut (byte)

.NET tipi Aralık

byte 1 Byte 0-255

char 2 Char Unicode char

bool 1 Boolean True/false

sbyte 1 Sbyte -128/127

short 2 Int16 -32K/+32K

ushort 2 Uint16 0-65K

int 4 Int32 -2B/+2B

uint 4 Uint32 0-4B

float 4 Single IEEE float

double 8 Double IEEE double

decimal 12 Decimal 28 digits fixed precision

long 8 Int64 +-9e16

ulong 8 UInt64 0-1.8e17

Page 19: C# Akademi 2005

19 (http://www.csharpnedir.com)

CLS - Common Language SpecificationOrtak Dil Standartları

CLR/CTS’nin altkümesi Sınırlı sayıda tür. Sınırlı özellikler Diller arası uyumluluk

VB.NET, C#.NET, J#.NET, Perl,Delphi,Cobol,Eiffel vs.

Diller arası uyumluluk istenmiyorsa CLS standartları ihmal edilebilir.

Page 20: C# Akademi 2005

20 (http://www.csharpnedir.com)

CLI - Common Language Infrastructure

CLI - ECMA – 335

http://www.ecma-international.org/publications/standards/Ecma-335.htm

Mono projesi (Linux) www.go-mono.com DotGNU Projesi (FreeBSD,Solaris,Mac OS) www.dotgnu.org

Page 21: C# Akademi 2005

21 (http://www.csharpnedir.com)

Assembly Nedir?

“Bir Assembly bir yada daha fazla veri türü tanımını ve kaynakları içeren .NET dosyasıdır.” – Richter

Her assembly manifest içerir. Manifest şunları içerir :

Assembly’de ki dosyaların isimleri

Assembly versiyonu Dil seçeneği-Culture Türler Geliştirici-Yayıncı

Application Domain Kavramı

Page 22: C# Akademi 2005

22 (http://www.csharpnedir.com)

Assembly Nedir?

CLR Assembly’ler üzerinde çalışır. Manifest’e bakarak yüklemeyi yapar, ardından alt dosyaları yükler.

.GIF ve .JPG gibi kaynakları içerebilir.

Assembly EXE yada DLL olabilir. “Assembly : Mantıksal EXE veya

DLL”

Page 23: C# Akademi 2005

23 (http://www.csharpnedir.com)

Assembly Yükleme

Strongly Named Assemblies (Public Assembly)(GAC Kurulumu)

Private Assemblies (XCOPY Kurulum)

Tek farkı kurulumla ilgilidir.

Page 24: C# Akademi 2005

24 (http://www.csharpnedir.com)

Public Assembly Global düzeyde kullanıma hazır Tekil özellikleri:

Dosya Adı Versiyon numarası Culture ID Public Tekil ID

Tekil ID ile imzalanmalıdır Use: SN –k keyfile.keys Keyfile.snk dosyası örneği.

İmzalandıktan sonra : GAC’a (Global Assembly Cache)

atılabilir GAC’ın adresi genellikle : c:\

windows\Assembly\GAC Bu işlem gacutil.exe ile yapılabilir. Yada GAC dizinine kopyalama ile

Page 25: C# Akademi 2005

25 (http://www.csharpnedir.com)

Private Assemblies

Tekil ID yok Uygulama dizininde

bulunur XCOPY kurulumu

yapılabilir. Uygulama ile taşınmalıdır.

Page 26: C# Akademi 2005

26 (http://www.csharpnedir.com)

Visual Studio.NET’in getirileri

Pratik geliştirme sağlar. .NET ortamında geliştirme yapmak için zorunlu değildir.

C# ve VB için çok benzer ortamlar GUI tasarımı ve gelişmiş hata

ayıklama(debugging) ASP.NET,Web ve Windows

servisleri kolayca oluşturulur. Kolay veritabanı erişim teknikleri Global yada lokal XML dosyalarını

oluşturma ve düzenleme

Page 27: C# Akademi 2005

27 (http://www.csharpnedir.com)

C# Komut Satırı Derleyicisi – csc.exe VS.NET’e ihtiyaç duymadan her türlü uygulamayı geliştirmemiz mümkündür. Hata ayıklama desteği csc /t:winexe /debug kaynak.cs

Hata Ayıklama(Debug) Örneği

Page 28: C# Akademi 2005

28 (http://www.csharpnedir.com)

Bazı önemli .NET araçları

Ngen.exe İldasm.exe Adepends.exe Cordbg.exe Gacutil.exe Sn.exe Regsvc.exe TlbImp.exe TlbExp.exe

...

Page 29: C# Akademi 2005

29 (http://www.csharpnedir.com)

Merhaba Dünya

Class ilk_program1{

static void Main(){

System.Console.WriteLine(“Merhaba Dünya”);}

}

Page 30: C# Akademi 2005

30 (http://www.csharpnedir.com)

Merhaba Dünya

C# ile yazılan kaynak dosyaların uzantıları cs dir.

Kaynak kodu komut satırından derlemek için, csc.exe programı kullanılır.

csc ilk_program1.cs

Page 31: C# Akademi 2005

31 (http://www.csharpnedir.com)

Merhaba Dünya

C# %100 nesne yönelimlidir. Herşey bir sınıf nesnesidir. Main() işlevi bir programın çalışmaya başladığı noktadır.

static void Main() Kaynak kodlar mutlaka bir sınıf bildirimi içinde yapılır.

Class ilk_program1

{

...

} Bütün C# programları en az bir sınıf bildirimi içermelidir.

Bir C# programının en temel özellikleri

Page 32: C# Akademi 2005

32 (http://www.csharpnedir.com)

Merhaba Dünya

Tüm kod satırları ; ile biter.

System.Console.WriteLine(“Merhaba Dünya”); Sınıflar ve işlevler küme parantezleri içine yazılır. { } İş yapan elemanlara metod denilir. NET sınıf

kütüphanesi binlerce metod içerir.

Bir C# programının en temel özellikleri

Page 33: C# Akademi 2005

33 (http://www.csharpnedir.com)

Merhaba Dünyausing System ;

using anahtar sözcüğü ile uygulamlarımıza isim alanlarını ve alt isim alanlarını ekleyebilir ve böylece ;

System.Console.WriteLine(“ Merhaba Dünya “ );

ifadesi yerine, bu ifadeyi dahada kısaltarak aşağıdaki formu kullanabiliriz.

Console.WriteLine(“ Merhaba Dünya “ );

Page 34: C# Akademi 2005

34 (http://www.csharpnedir.com)

Temel Veri Türleri

Temel Veri Türleri

Önceden TanımlanmışVeri Türleri

KullanıcıTanımlı

Veri Türleri

Referans TipiDeğer Tipi

Page 35: C# Akademi 2005

35 (http://www.csharpnedir.com)

Değişken Nedir?

Değişkenler içlerinde farklı türlerde veri saklayabildiğimiz bellek alanlarının programlamadaki karşılığıdır.

Page 36: C# Akademi 2005

36 (http://www.csharpnedir.com)

Bellek Alanları

Stack

Heap

Ram Olmayan Bölge

Constant

Register

Static

Page 37: C# Akademi 2005

37 (http://www.csharpnedir.com)

Bellek Alanları

RAM’de yer alır. Değer Tiplerinin tutulduğu yer. Stack’ta tutulacak verilerin çalışma zamanı öncesinde ne

kadar yer kaplayacağının bilinmesi gerekir.

Stack;

Page 38: C# Akademi 2005

38 (http://www.csharpnedir.com)

Bellek Alanları

RAM’de yer alır. Referans türlerinin tutulduğu yer. Bütün C# nesneleri bu bölgede tutulur. Tutulacak nesnenin derleyeci tarafından bilinmesi

zorunlu değildir. Tutulacak veriler çalışma zamanında dinamik olarak

yaratılır. İşlem hızı stack’a göre daha yavaştır.

Heap;

Heap’te tutulacak bir nesne oluşturmak için new anahtar kelimesini kullanırız.

Page 39: C# Akademi 2005

39 (http://www.csharpnedir.com)

Bellek Alanları

İkincil Önbellek’te yer alır. Sadece derleyici erişir. Programcının doğrudan erişme hakkı yoktur. Stack ve Heap’e göre çalışma mekanizması çok daha

hızlıdır.

Register;

Page 40: C# Akademi 2005

40 (http://www.csharpnedir.com)

Bellek Alanları

Bellekteki herhangibir sabit bölge. Veri, programın çalışması boyunca saklanır.

Static;

Static veriler için static anahtar sözcüğü kullanılır.

Page 41: C# Akademi 2005

41 (http://www.csharpnedir.com)

Bellek Alanları

Değişmesi istenmeyen veriler için kullanılır. Yanlız okunabilir amaçlı olduklarından bazen ROM’da

tutulurlar.

Constant;

Page 42: C# Akademi 2005

42 (http://www.csharpnedir.com)

Bellek Alanları

Disk alanları. Kalıcı olması istenen veri türleri için kullanılır. Örneğin

veritabanlarının tutulduğu disk bölgeleri.

RAM Olmayan Bölge;

Page 43: C# Akademi 2005

43 (http://www.csharpnedir.com)

Değişken Tanımlama

Değişkenleri, ilk değer ataması yapmadan kullanmak yasaktır.

Değişken tanımlamaları kaynak kodun herhangibir yerinde olabilir.

Virgül kullanarak bir satırda birden fazla değişken aynı türden olmak koşuluyla tanımlanabilir.

double a,b,c;

Programın çalışması süresince kullanacağımız verileri depolamak için değişkenleri kullanırız.

Page 44: C# Akademi 2005

44 (http://www.csharpnedir.com)

Değişken İsimlendirme Değişken isimleri büyük küçük harf duyarlıdır.

int Ucret;

int UCRET; Değişken isimleri nümerik karakterler ile başlayamaz.

İnt 1Ucret; Değişken isimlerinde boşluk karakteri kullanılamaz.

int ucret Artisi;

Page 45: C# Akademi 2005

45 (http://www.csharpnedir.com)

Değişken Faaliyet Alanları

Bir sınıfın üye alanı olarak tanımlanmış değişken her zaman sınıfın faaliyet alanı içindedir.

Yerel bir değişken tanımlandığı blok arasında kaldığı sürece faaliyet alanındadır.

For döngüleri gibi döngü bloklarında tanımlanan değişkenler döngünün dışında geçersizdir.

Page 46: C# Akademi 2005

46 (http://www.csharpnedir.com)

Sabit (Constant) TanımlanmasıBir program boyunca değerinin değişmeyeceğini

düşündüğümüz veriler Constant (sabit) olarak tanımlanır.

Sabit değişkenlerin değerlerini programın çalışması sırasında değiştirmeye çalışmak hataya yol açar.

Sabitlere ilk değer verilirken sabitler kullanılır.

Sabitler içsel tasarım olarak static olduklarından, ayrıca static olarak tanımlamaya çalışmak hataya yol açar.

Page 47: C# Akademi 2005

47 (http://www.csharpnedir.com)

Değer ve Referans Türleri

Page 48: C# Akademi 2005

48 (http://www.csharpnedir.com)

Değer Türleri Arası Atama

İki değer tipi nesnesi birbirine eşitlenirken, değişkenlerde saklanan değerler kopyalanarak eşitlenir ve bu durumda iki yeni bağımsız nesne elde edilmiş olur. Yani birisinin değerini değiştirmek diğerini etkilemez.

Page 49: C# Akademi 2005

49 (http://www.csharpnedir.com)

Değer Türleri için Varsayılan DeğerlerVeri Tipi Varsayılan Değer

bool False

byte 0

char ‘\0’

decimal 0.0M

double 0.0D

enum Enum sabitindeki, 0 indisli değer.

float 0.0F

Int 0

long 0L

SByte 0

Short 0

Struct Yapıdaki tüm değer tipleri varsayılan değer, tüm referans tipleride null değere atanır.

Uint 0

Ulong 0

UShort 0

Page 50: C# Akademi 2005

50 (http://www.csharpnedir.com)

Değer TürleriVeri Tipi

CTS Karşılığı Açıklama Max Min

sbyte System.Byte 8 bit işaretli tamsayı -128 127

short System.Int16 16 bit işaretli tamsayı -32.768 32.767

int System.Int32 32 bit işaretli tamsayı -2.147.483.648 2.147.483.647

long System.Int64 64 bit işaretli tamsayı -9.223.372.036.854.775.808 9.223.372.036.854.775.807

byte System.Byte 8 bit işaretsiz tamsayı 0 255

ushort System.UInt16 16 bit işaretsiz tamsayı 0 65.535

uint System.UInt32 32 bit işaretsiz tamsayı 0 4.294.967.295

ulong System.UInt64 64 bit işaretsiz tamsayı 0 18.446.744.073.709.551.615

float System.Single 32 bit tek kayan sayı +/- 1,5 x 10^-45 +/- 3,4 x 10^38

double System.Double 64 bit çift kayan sayı +/- 5 x 10^-324 +/- 1,7 x 10^-308

decimal System.Decimal 128 bit ondalıklı sayı +/- 1,5 x 10^-28 +/- 7,9 x 10^28

bool System.Boolean

Doğru yada yanlış true / false

char System.Char Karakterleri temsil eder 16- Unicode Karakterleri

Page 51: C# Akademi 2005

51 (http://www.csharpnedir.com)

Referans TürleriÖnceden tanımlanmış iki referans türü vardır.

string veri türü object veri türü

Page 52: C# Akademi 2005

52 (http://www.csharpnedir.com)

Tür Dönüşümü

Bilinçli Tür Dönüşümü Bilinçsiz Tür Dönüşümü

Farklı türden değişkenleri aynı ifade içerisinde kullanbilmek için tür dönüşümleri yapılır

Büyük Tür Küçük Tür

Küçük Tür Büyük Tür

Büyük Tür Küçük Tür

Küçük Tür Büyük Tür

Yasaklanmıştır

Page 53: C# Akademi 2005

53 (http://www.csharpnedir.com)

Bilinçsiz Tür Dönüşümü

Tür dönüşümünde her hangibir veri kaybı olmaz. Fazla olan bitler 0 ile beslenir.

Küçük TürBüyük Tür;

Page 54: C# Akademi 2005

54 (http://www.csharpnedir.com)

Bilinçsiz Tür Dönüşümü

Byte türleri arasında aritmetiksel işlemler yapılırken sonuç mutlaka int yada daha büyük türden bir değişkene aktarılmalıdır.

Küçük TürBüyük Tür;

byte a=5;byte b=3;byte c=a+b; Cannot implicitly convert type ‘int’ to ‘byte’

Page 55: C# Akademi 2005

55 (http://www.csharpnedir.com)

Bilinçsiz Tür DönüşümüKüçük TürBüyük Tür;

Tür Dönüşebileceği Tür

sbyte short,int,float,long,double,decimal

byte short,ushort,int,uint, long,ulong,float,double,decimal

short int,long,float,double,decimal

ushort int,uint,long,ulong,float,double,decimal

int long,float,double,decimal

uint long,ulong,float,double,decimal

long, ulong float,double,decimal

char ushort,int,uint,long,ulong,float,double,decimal

float double

Page 56: C# Akademi 2005

56 (http://www.csharpnedir.com)

Bilinçli Tür Dönüşümü Derleyicinin izin vermediği tür dönüşümlerinde yapılır. Veri kayıplarına sebep olabilir. Küçük Tür Büyük Tür dönüşümleri, bilinçsiz türde olduğu

gibidir. Dönüşümler için tür dönüşüm operatörleri kullanılır.

Page 57: C# Akademi 2005

57 (http://www.csharpnedir.com)

Bilinçli Tür DönüşümüBüyük TürKüçük Tür;

Bilinçli olarak büyük türler, küçük türlere çevrilirken veri kayıpları olabilir.

Page 58: C# Akademi 2005

58 (http://www.csharpnedir.com)

Checked ve Unchecked Anahtar Sözcükleri

Bilinçli tür dönüşümleri sonucu oluşabilecek veri kayıplarının önüne geçmek için, tür dönüşümlerinin yer aldığı kodları checked blokları içine alırız. Böylece, exception türetilmesi sağlanır.

Checked bloklarında tanımlanan değişkenler blok dışında tanınlanamazlar.

Checked kod bloğunun içinde veri kayıplarına neden olabilecek durumların göz ardı edilmesi gerekirse unchecked blokları kullanılır.

Page 59: C# Akademi 2005

59 (http://www.csharpnedir.com)

Boxing (Kutulama)Bir nesnenin object türüne bilinçli yada bilinçsiz

dönüştürülmesidir. Stack bölgesinde tutulan veri bit olarak heap alanına kopyalanır.

Page 60: C# Akademi 2005

60 (http://www.csharpnedir.com)

UnBoxing (Kutuyu Kaldırmak)Heap bölgesindeki nesnenin değerini bit olarak stack bölgesine kopyalar.

Unboxing işlemine tabi tutulacak veri önceden boxing işlemine tutulmuş olmalıdır.

Unboxing işlemi sırasında doğru tür dönüşümü kullanılmalıdır.

Page 61: C# Akademi 2005

61 (http://www.csharpnedir.com)

Convert.ToString Metodu ToString metodu System isim alanındaki

Convert sınıfına ait bir metottur. Convert sınıfının diğer metodlar genellikle, string

türde verileri, diğer veri türlerine dönüştürmek için kullanırız.

Page 62: C# Akademi 2005

62 (http://www.csharpnedir.com)

Convert SınıfıMetod Açıklama

Convert.ToBoolean(string str) string str nesnesini bool türüne çevirir.

Convert.ToByte(string str) string str nesnesini byte türüne çevirir.

Convert.ToSByte(string str) string str nesnesini Signed byte türüne çevirir.

Convert.ToInt16(string str) string str nesnesini short türüne çevirir.

Convert.ToUInt16(string str) string str nesnesini ushort türüne çevirir.

Convert.ToInt32(string str) string str nesnesini int türüne çevirir.

Convert.ToUInt32(string str) string str nesnesini uint türüne çevirir.

Convert.ToInt64(string str) string str nesnesini long türüne çevirir.

Convert.ToUInt64(string str) string str nesnesini ulong türüne çevirir.

Convert.ToSingle(string str) string str nesnesini float türüne çevirir.

Convert.ToDouble(string str) string str nesnesini double türüne çevirir.

Convert.ToDecimal(string str) string str nesnesini decimal türüne çevirir.

Convert.ToChar(string str) string str nesnesini char türüne çevirir.

Page 63: C# Akademi 2005

63 (http://www.csharpnedir.com)

Operatör Nedir?

Önceden tanımlanmış bir takım matematiksel yada mantıksal işlemleri yapmak için kullanılan özel karakter yada karakterler topluluğudur.

Page 64: C# Akademi 2005

64 (http://www.csharpnedir.com)

Operatörlerin Sınıflandırılması

Yapılarına Göre Sınıflandırma

Unary(), [], ++, --, +, -, ~, new, checked, unchecked, typeof, sizeof

Binary*, /, %, +, -, <, <=, >, >=, as, is, <<, >>, ==, !=, &, ^, |, &&, ||, =, *=, /=, +=, -=, <<=, >>=, &=, ^=, |=

Ternary?:

İşlvelerine Göre Sınıflandırma

Aritmetik (Arithmetic) +, -, *, /, %, ++, --

Karşılaştırma (Comparison)

>, <, >=, <=, ==, !=, as, is

Mantıksal (Logical) ||, &&, !

Bitsel (Bitwise) |, &, ~, ^, <<, >>

Atama ve İşlemli Atama(Assignment)

=, *=, +=, -=, /=, <<=, =>>, &=, ^=, |=

Özel Amaçlı (Special Case)?:, (), [],+, -, &, *, ->, ., new, checked, unchecked, typeof, sizeof

Page 65: C# Akademi 2005

65 (http://www.csharpnedir.com)

Operatör ÖnceliğiÖncelik Operatör

Birincil Öncelik x.Y(nesne erişim operatörü), f(x), dizi[x], x++, x--, new, typeof, checked, unchecked

Unary Operatörler +, -, !, ~, ++x, --x, (tür)x

Çarpma Bölme Operatörleri *, /, %

Toplama Çıkarma Operatörleri -, +

Kaydırma Operatörleri <<, >>

İlişkisel ve Tür Testi Operatörleri <, >,<=, >=, is, as

Eşitlik Operatörleri ==, !=

Mantıksa ve &

Mantıksal Özel veya ^

Mantıksal Veya |

Koşullu ve &&

Koşullu veya ||

Koşul Operatörü ?:

Atama ve işlemli atama Operatörleri =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

Page 66: C# Akademi 2005

66 (http://www.csharpnedir.com)

Aritmetik OperatörlerToplama ve Çıkarma ;

int i =50+40;float f=12.56f + 11.4f;

Bölme ve Çarpma ;

float f = 50f / 40f;

int d = 50 / 40;

sonuç float değişkene aktarıldığından 1,25

sonuç int değişkene aktarıldığından virgüldensonraki kısım atılır. Sonuç 1 olur.

% KalanBirinci operand’ın ikinci operanda bölümündenkalanı verir. Sonuç 1 dir.

c = 10 % 3;

Page 67: C# Akademi 2005

67 (http://www.csharpnedir.com)

Aritmetik Operatörler++ Arttırma ve -- Azaltma

int a=10;int b;int c;b=a++;c=++a;

a=?b=?c=?

Page 68: C# Akademi 2005

68 (http://www.csharpnedir.com)

Aritmetik Operatörler

int a=10;

int b;

int c;

b=a++;

c=++a;

İlk önce atama b=10

Sonra arttırma a=11

Önce arttırma a=12

Sonra atama c=12

++ Arttırma ve -- Azaltma

Page 69: C# Akademi 2005

69 (http://www.csharpnedir.com)

a=4

b=a++b=4

a=5

b=a--b=4

a=3

b=++aa=5

b=5

b=--aa=3

b=3

Aritmetik Operatörler++ Arttırma ve -- Azaltma

Page 70: C# Akademi 2005

70 (http://www.csharpnedir.com)

Karşılaştırma Operatörleri

Büyüktür > ve Küçüktür <

bool b1 = 45 > 40;

bool b2 = 40 < 30;

Büyüktür eşittir >= ve Küçüktür Eşittir <= ;

bool b1 = 50 <= 50;

bool b2 = 50 >= 45;

Sonuçlar bool veri tipinden true veya false olur

true

false

true

true

Eşittir == ve Eşit Değildir != ;

bool b1 = 50 = 48;

bool b2 = 50 != 48;

false

true

Page 71: C# Akademi 2005

71 (http://www.csharpnedir.com)

Karşılaştırma Operatörlerias operatörü

is operatörü

Uygun türler arasındaki dönüşümü sağlar. Üretilen değer referans türündendir. Dönüşüm işlemi başarısız olursa null değer üretilir.

object o=“50”;string s=o as string;

Çalışma zamanında bir nesnenin türünün operand ile verilen türe uyumlu olup olmadığını kontrol eder.

Üretilen değer true yada false olur.

int i=50;bool b1 = i is int;bool b2 = i is double;

true

false

Page 72: C# Akademi 2005

72 (http://www.csharpnedir.com)

Mantıksal Operatörler

1nci Operand İkinci Operand Sonuç

true true true

true false false

false true false

false false false

VE && Operatörü;

İki operandda true ise true döner, aksi hallerde false döner.

bool b1 = 10 < 20 && 10 == 50;

true false&& false

bool b1 = 10 < 20 && 10 == 10; true

Page 73: C# Akademi 2005

73 (http://www.csharpnedir.com)

Mantıksal Operatörler

1nci Operand İkinci Operand Sonuç

true true true

true false true

false true true

false false false

VEYA || Operatörü;

Operandlardan en az birisi true ise true döner.

bool b1 = 10 < 20 || 10 == 50;

true false|| true

bool b1 = 10 > 20 && 10 == 11; false

Page 74: C# Akademi 2005

74 (http://www.csharpnedir.com)

Mantıksal Operatörler

Operand Sonuç

true false

false true

DEĞİL ! Operatörü;

Operandın mantıksal değilini verir.

bool b1 = ! (10 < 20) ;

true! false

Page 75: C# Akademi 2005

75 (http://www.csharpnedir.com)

Bitsel Operatörler

Sayıların bütünü değil, sayıları oluşturan bitler üzerinde kullanılır.

Sadece tam sayılarda kullanılır. Gerçel sayılarda kullanılamaz.

Bitlerin durumlarını öğrenmek, bitleri 0 yada 1 yapmak gibi alt seviye işlemlerde kullanılırlar.

Page 76: C# Akademi 2005

76 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL DEĞİL ~ Operatörü;

Bit Sonuç

1 0

0 1

1 leri 0, 0 ları 1 yapar. Bu aynı zamanda sayının tümleyeninin bulunmasıdır.

byte a = 255;

byte b= (byte) ~ 255;

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1~

0 0 0 0 0 0 0 0

Page 77: C# Akademi 2005

77 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL VE & Operatörü;

1nci Bit 2 nci Bit Sonuç

1 1 1

1 0 0

0 1 0

0 0 0

Her iki bit 1 ise, 1 döner. Aksi halde 0 döner.

byte a = 145;

byte b=73;

int c=(byte) ( a & b);

1 0 0 1 0 0 0 1

0 1 0 0 1 0 0 1

0 0 0 0 0 0 0 1

&

Page 78: C# Akademi 2005

78 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL VE & Operatörü;

Bir sayıyı bütün bitleri 1 olan bir sayı ile bitsel ve işlemine sokmak, sayının değerini değiştirmez. Çünkü 1 bitsel ve işleminde etkisiz elemandır.

Bir sayıyı bütün bitleri 0 olan bir sayı ile bitsel ve işlemine sokmak sayının değerini 0 yapar. Çünkü 0 bitsel ve işleminde yutan elemandır.

Page 79: C# Akademi 2005

79 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL VEYA | Operatörü;

1nci Bit 2 nci Bit Sonuç

1 1 1

1 0 1

0 1 1

0 0 0

Bitlerden en az birisi 1 ise, 1 döner.

byte a = 145;

byte b=73;

int c=(byte) ( a | b);

1 0 0 1 0 0 0 1

0 1 0 0 1 0 0 1

1 1 0 1 1 0 0 1

|

Page 80: C# Akademi 2005

80 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL ÖZEL VEYA ^ Operatörü;

1nci Bit 2 nci Bit Sonuç

1 1 0

1 0 1

0 1 1

0 0 0

Bitlerden her ikiside farklı ise 1 döner.

Page 81: C# Akademi 2005

81 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL ÖZEL VEYA ^ Operatörü;

Özel veya geri dönüşümlü işlem yapar. Bir sayıyı özel veya işlemine tabi tuttuktan sonra aynı sayı ile tekrar özel veya işlemine tabi tutmak başlangıçtaki sayıyı verir.

byte b = 10;

byte c = 99;

c=(byte) ( c ^ b ) ;

c=(byte) ( c ^ b ) ;

0 0 0 0 1 0 1 0

0 1 1 0 0 0 1 1

0 1 1 0 1 0 0 1

0 1 1 0 0 0 1 1

Page 82: C# Akademi 2005

82 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL SOLA KAYDIRMA << Operatörü;

Bir sayının bitlerini istenilen sayı kadar sola öteler. İlk bit her zaman 0 ile beslenir, son bit ise ötelemeden dolayı atılır.

byte b = 10;

byte c = (byte) ( b << 1 ) ;

0 0 0 0 1 0 1 0

0 0 0 0 1 0 1 0 0

0 0 0 1 0 1 0 0

Sola 1 kez öteleme bir sayının 2 ile çarpılmış halini verir. 2 kez öteleme sayının 4 katını, 3 kez öteleme sayının 8 katını, 4 kez öteleme 16 katını verir.

Page 83: C# Akademi 2005

83 (http://www.csharpnedir.com)

Bitsel OperatörlerBİTSEL SAĞA KAYDIRMA >> Operatörü;

Bir sayının bitlerini istenilen sayı kadar sağa öteler. Son bit her zaman 0 ile beslenir, ilk bit ise ötelemeden dolayı atılır.

byte b = 137;

byte c = (byte) ( b >> 1 ) ;

1 0 0 0 1 0 0 1

0 1 0 0 0 1 0 0 1

0 1 0 0 0 1 0 0

Sağa bir kez öteleme, sayının yarısını verir. Ancak sayı tek sayı ise, bu durumda, çıkan sonucun tam kısmı elde edilir. Yani 7 >> 1 = 3 olur.

Page 84: C# Akademi 2005

84 (http://www.csharpnedir.com)

Atama ve İşlemli Atama Operatörleri= ATAMA Operatörü;

Bir değişkene herhangibir değeri atamak için kullanılır.

İŞLEMLİ ATAMA Operatörleri;

*=, +=, -=, /=, <<=, =>>, &=, ^=, |=

a*=b; a=a*b;

a+=b; a=a+b;

a-=b; a=a-b;

a<<=b;

a=a<<b;

a^=b; a=a^b;

a/=b; a=a/b

Page 85: C# Akademi 2005

85 (http://www.csharpnedir.com)

Özel Amaçlı Operatörler?: Operatörü;

Koşullu ifadeler için kullanılır.

koşul ? doğru_değer : yanlış_değer;

str = str + ( sayi == 1 ? “ “ : “LER” );

koşul

koşul doğru ise

koşul yanlış ise

Page 86: C# Akademi 2005

86 (http://www.csharpnedir.com)

Özel Amaçlı OperatörlerOperatör İşlevi Örnek

() Tür Dönüştürme Operatörü

Tür dönüşümleri için kullanılır.byte a=2;

int c=(int)a;

[] Indeks Operatörü Dizi elemanlarına ulaşmak için kullanılır. int a=dizi[1];

+ ve - Bir değişkenin negatif (-) yada pozitif (+) olmasını sağlar.

int a=10;

int b=-a;

.Bir sınıfın yada yapının elemanlarına erişmek için kullanılır.

Console.WriteLine();

new Yeni bir nesne oluşturmak için kullanılır.Sinif a=new Sinif();

int i=new int();

checked / unchecked

typeofHer hangibir türe ilişkin System.Type sınıfı türünden bir nesne üretir.

int a=10;

Type t1=typeof(a);

Page 87: C# Akademi 2005

87 (http://www.csharpnedir.com)

Konular

Karar Yapıları (if, switch) Döngüler (for,while,do while,foreach) Atlama Deyimleri (goto,return,break,continue)

Page 88: C# Akademi 2005

88 (http://www.csharpnedir.com)

Deyim ve İfade

Deyim(statement) Örneği

a = (a << b) + c;

İfade(expression) Örneği

a = (a << b) + c

Page 89: C# Akademi 2005

89 (http://www.csharpnedir.com)

if-else Karar Verme YapısıAkış diyagramı

Page 90: C# Akademi 2005

90 (http://www.csharpnedir.com)

if-else Karar Verme YapısıKontrollü akış yapmamızı sağlar.

if (ifade)

deyim1

else

deyim2

bool bir sonuç üretmeli !

if (ifade)

deyim1

else ifadesi olmayan yapı

Page 91: C# Akademi 2005

91 (http://www.csharpnedir.com)

Birleşik if-else Bloklarıİf bloklarında birden fazla deyim çalışabilir.

İf (ifade){ deyim1 deyim2}else{ deyim3 deyim4}

İf (ifade){ deyim1 deyim2}

Page 92: C# Akademi 2005

92 (http://www.csharpnedir.com)

Merdiven şeklindeki if-else BloklarıÇoklu koşuldan birini seçme durumu:

if (ifade1) deyim1else if(ifade2) deyim2else if(ifade3) deyim3else deyim4

Her bir if bloğunda birden fazladeyim olabilir?

Page 93: C# Akademi 2005

93 (http://www.csharpnedir.com)

İçiçe if-else BloklarıGerçek hayatta en çok kullanılan biçim

if (kosul1){

if (kosul2)deyim1

else{

deyim2deyim3

}}else

deyim4

Okunabilirlik açısından süslü parantez kullanmak gerekir.

Page 94: C# Akademi 2005

94 (http://www.csharpnedir.com)

Tehlikeli Durum - 1Gözden kaçan durumlar olabilir:

if (ifade1); deyim1

Acemi programcıların gecelerinialabilecek bir durumu.

int a = 5;if (a != 5); deyim1

Derleme hatası alınmaz.

Page 95: C# Akademi 2005

95 (http://www.csharpnedir.com)

Tehlikeli Durum - 2

int a = 4,b = 5;if(a != 4) if(b == 5) Console.WriteLine("Doğru"); else Console.WriteLine("Yanlış");

int a = 4,b = 5;if(a != 4) if(b == 5) Console.WriteLine("Doğru");else Console.WriteLine("Yanlış");

Page 96: C# Akademi 2005

96 (http://www.csharpnedir.com)

Koşul Operatörü (?:)

İfade 1 ? İfade 2 : ifade 3

Kısa if – else blokları yerine kullanılabilir.

Test Koşulu (bool) Doğru KararYanlış Karar

?: Operatörü

Page 97: C# Akademi 2005

97 (http://www.csharpnedir.com)

switch-case Koşul İfadesiKompleks if-else blokları yerine okunabilirliği artırmak için

tercih edilir. İf-else bloklarına göre daha az yeteneklidir.

switch(sabit ifadesi){

case sabit1 :deyim1break;

case sabit2 :deyim2break;

default :deyim3break;

}

switch(sabit ifadesi){ case sabit1 : deyim1; break; case sabit1 : deyim2; break; default : deyim3; break;}

Neden hatalı ?

Page 98: C# Akademi 2005

98 (http://www.csharpnedir.com)

Önemli Kurallar break deyimi zorunludur. Bir case deyimi sağlandığı zaman ikinci bir case

deyimine goto anahtar sözcüğü ile açıkça belirtilmedikçe geçilemez (C,C++ dillerinde böyle değil)

switch(sabit ifadesi){ case sabit1 : deyim1; case sabit2 : deyim2; break; default : deyim3; break;}

Hata : Control cannot fall through from one case label ('case 1:') to another

switch(sabit ifadesi){ case sabit1 : deyim1; goto case 2; case sabit2 : deyim2; break; default : deyim3; break;}

Page 99: C# Akademi 2005

99 (http://www.csharpnedir.com)

switch-case Koşul İfadesiOrtak case ifadeleri

int a = 2;switch(a){ case 1 : case 2 : Console.WriteLine("Case1 ve Case2");break; case 3 : Console.WriteLine("Case3");break;}

* Default yok !

Page 100: C# Akademi 2005

100 (http://www.csharpnedir.com)

Özet case anahtar sözcüğünün yanındaki ifadeler sabit olmak zorundadır. Bu ifadeler içinde değişken bulunamaz. case ifadeleri C#’ ta herhangi bir tamsayı sabiti , karekter yada string sabiti olabilir. default durumunu istediğimiz yere yazabiliriz. Aynı şekilde case ifadelerinide istediğimiz sırada yazabiliriz. Bir switch bloğunda iki yada daha fazla sayıda aynı case ifadesi bulunamaz. Bir switch bloğunda default case olmak zorunda değildir. Akış herhangi bir case ifadesine geldiğinde, akışı farklı bir case ifadesine yönlendirilmek istenirse goto anahtar sözcüğü kullanılır.

Page 101: C# Akademi 2005

101 (http://www.csharpnedir.com)

Alıştırma 2 + 3, 2 * 5, 3 / 4 gibi işlemleri yapabilen bir konsol uygulaması

yapınız. Her iki operand ve operatör kullanıcı tarafından elle girilecektir.

Kitap Kapalı

Page 102: C# Akademi 2005

102 (http://www.csharpnedir.com)

Döngüler (Loops)

for döngüsü while döngüsü do-while döngüsü foreach döngüsü

Profesyonel uygulama geliştirmeye ilk adım

Döngüler bir yada daha fazla deyimin belirli bir koşul sağlanana kadar bir yada daha fazla sayıda çalıştırılmasını sağlar.

Page 103: C# Akademi 2005

103 (http://www.csharpnedir.com)

for Döngüleri

for (ifade1; ifade2; ifade3)     deyim1;

for (ifade1; ifade2; ifade3) {     deyim1;     deyim2;      ... }

ifade1 : Bir defa çalıştırılır. (Akış for döngüsüne geldiğinde) ifade2 : Koşul ifadesidir. Bool türünden değer üretmelidir. İfade3 : Genellikle sayaç görevinde kullanılır. Kullanılmayabilir.

Page 104: C# Akademi 2005

104 (http://www.csharpnedir.com)

for döngüsü Animasyonu

donguler_flash_for.swf

Page 105: C# Akademi 2005

105 (http://www.csharpnedir.com)

Farklı kullanımlarchar ch;

for (ch=Convert.ToChar(Console.ReadLine()); ch != 'q‘ ; ch =Convert.ToChar(Console.ReadLine()))

Console.WriteLine(ch);

int k = 0;

for (; k< 10; ++k)   Console.WriteLine(k);

int k = 0;for (; k< 10;){

Console.WriteLine(k);++k;

}

Page 106: C# Akademi 2005

106 (http://www.csharpnedir.com)

Sonsuz döngüler(!)int k = 0;

for (;;)

{

Console.WriteLine(k);

++k;

}

Page 107: C# Akademi 2005

107 (http://www.csharpnedir.com)

Örnek 1’den 10000 e kadar olan sayılar içerisinde

5’e tam bölünen aynı zamanda 7 ‘ye tam bölünemeyen sayıların sayısını bulan, toplamını bulan ve bu sayıları listeleyen programı yazınız.

Page 108: C# Akademi 2005

108 (http://www.csharpnedir.com)

Alıştırma Aşağıdaki ekran görüntüsünü elde edecek programı

yazınız. Yıldız dörtgenindeki satır ve sütun sayısı sabit olmamakla beraber kullanıcı tarafından girilecektir.

Kitaplar kapalı !

Page 109: C# Akademi 2005

109 (http://www.csharpnedir.com)

while Döngüleriwhile(koşul)

deyim while(koşul){

deyim1deyim2...

}

int n=0;int toplam=0;while(n <= 100){

toplam += n;n += 2;

}

Page 110: C# Akademi 2005

110 (http://www.csharpnedir.com)

while Döngüleriwhile (--n>=0){ // Bu döngü size neyi ifade ediyor? }

while döngü yapısını kullanarak 1’den 100’e kadar olan çift sayıların toplamını bulan programı yazınız?

Kitaplar kapalı !

Page 111: C# Akademi 2005

111 (http://www.csharpnedir.com)

do while Döngülerido

deyimwhile(koşul);

do while döngülerinde döngü bloğundaki deyimler en az bir kez çalıştırılırlar.

do{

deyim1deyim2

}while(koşul);

while(koşul); deyim

Page 112: C# Akademi 2005

112 (http://www.csharpnedir.com)

do while – Klasik Kullanımdo{

Console.Write("Şifreyi giriniz :");yazi = Console.ReadLine();

}while (yazi != "sifre"););

while döngüsünden tek farkı döngü koşulunun bulunduğu yerdir.

Page 113: C# Akademi 2005

113 (http://www.csharpnedir.com)

foreach Döngü Yapısı

foreach (int x in Dizi){          Console.WriteLine(x);}

Yeni bir döngü yapısıdır. Diziler ve koleksiyon tabanlı nesneleri elemanları arasında dolaşmak için kullanılır. Diziler konusunda daha detaylı inceleyeceğiz.

Döngünün her iterasyonunda elde edilen eleman read only özelliğine sahiptir. Bu nedenle elle içeriği değiştirilemez.

Page 114: C# Akademi 2005

114 (http://www.csharpnedir.com)

Atlama(Jump) Deyimleri break deyimi continue deyimi return deyimi goto deyimi (!)

Atlama deyimi ile ilgili örnekler.

Page 115: C# Akademi 2005

115 (http://www.csharpnedir.com)

Diziler Bellekte ardışıl bulunan aynı türden nesneler kümesine dizi denilmektedir. Bir dizi içierisindeki bütün elemanlara aynı isimle ulaşır. Dizilerin eleman sayısı sabittir, sonradan değiştirilemez. Derleme zamanında boyutu bilinmeyebilir. C ve C++’ta bu böyle değildir.

Page 116: C# Akademi 2005

116 (http://www.csharpnedir.com)

Diziler Dizi sınırlarını aşmak C ve C++’ ın aksine yasaklanmıştır. Bütün diziler FCL’de System.Array sınıfını karşılık düşerler. Dizilerde temel veri türleri gibi birer tür olarak görülmelidri. Örneğin int türünden biri dizi, object türden bir dizi yada Ogrenci sınıfı türünden bir dizi.

Page 117: C# Akademi 2005

117 (http://www.csharpnedir.com)

Dizi değişkenleri tanımlamaint[] dizi = new int[25];

Yukarıdaki dizi tanımlamalarında bütün dizi elemanları varsayılan olarak 0 değerine atanır.Bunu örnek bir program ile gösterelim.

Varsayılan değer her veri tipi için farklı olacağını unutmamak gerekir.

int[] dizi;dizi = new int[25];

int i = dizi[0];int i = dizi[7];

Bildirim ve tanımlama arasındaki fark nedir?

Page 118: C# Akademi 2005

118 (http://www.csharpnedir.com)

Diğer bir dizi tanımlama biçimistring[] dizi1 = {"Bir","İki","Üç"};int[] dizi2 = {1,2,3};float[] dizi3 = {1f,2f,3f};

Yukarıdaki dizi tanımlamalarında bütün dizi elemanları varsayılan olarak 0 değerine atanır.Bunu örnek bir program ile gösterelim.

Varsayılan değer her veri tipi için farklı olacağını unutmamak gerekir.

3 elemanlı diziler

int[] dizi1=new int[10],dizi2 = new int[10];

int[] dizi1,dizi2;

Page 119: C# Akademi 2005

119 (http://www.csharpnedir.com)

foreach döngüsü ve diziler

int[] dizi = {1,2,3,4,5};foreach(int eleman in dizi)

Console.WriteLine(eleman);

Foreach döngü yapısı diziler gibi birden fazla eleman içeren yapılar için tasarlanmıştır.

int[] dizi = {1,2,3,4,5};foreach(int eleman in dizi)

eleman = 5;

Yukarıdaki blok doğrumu?

Page 120: C# Akademi 2005

120 (http://www.csharpnedir.com)

Çok boyutlu dizilerHer bir elemanı yine bir dizi olan dizi çeşitlerine çok boyutlu dizidenir.

Matris dizileri Düzensiz(Jagged) diziler

Page 121: C# Akademi 2005

121 (http://www.csharpnedir.com)

Matris Dizileri

int[,] dizi = {{1,2},{3,4},{5,6}};

3X2 boyutlu matris dizisi : 3 satır sayısı, 2 sütun sayısı

dizi[0,0] = 1dizi[0,1] = 2dizi[1,0] = 3dizi[1,1] = 4dizi[2,0] = 5dizi[2,1] = 6

3X4 Matrisi

Page 122: C# Akademi 2005

122 (http://www.csharpnedir.com)

Matris Dizileri

int[,,] dizi = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};

Matris dizileri iki boyutlu olmak zorunda değildir.

Bu dizi kaç boyutludur ve her boyut kaç eleman içerir?

Cevap : 3 boyutlu, Eleman sayısı (3,2,2)

dizi[0,0,0]=1 dizi[1,1,0]=7dizi[0,0,1]=2 dizi[1,1,1]=8dizi[0,1,0]=3 dizi[2,0,0]=9dizi[0,1,1]=4 dizi[2,0,1]=10dizi[1,0,0]=5 dizi[2,1,0]=11dizi[1,0,1]=6 dizi[2,1,1]=12

2’den fazla boyutlu diziler gerçek hayatta çok fazla kullanılmaz

Page 123: C# Akademi 2005

123 (http://www.csharpnedir.com)

Matris Dizileri Elemanlarına ErişimÖrnek program inceleme

Page 124: C# Akademi 2005

124 (http://www.csharpnedir.com)

Düzensiz(jagged) Diziler

int[][] dizi = new int[3][]; //düzensiz dizi tanımlamadizi[0] = new int[3];dizi[1] = new int[4];dizi[2] = new int[2];

Her bir elemanı farklı sayıda elemanlı dizilerden oluşan dizilerdir

dizi[0,0] = 1dizi[0,1] = 2dizi[1,0] = 3dizi[1,1] = 4dizi[2,0] = 5dizi[2,1] = 6

Page 125: C# Akademi 2005

125 (http://www.csharpnedir.com)

Düzensiz(jagged) Diziler

int[][] dizi = new int[3][];

dizi[0] = new int[]{1,2,3};dizi[1] = new int[]{4,5,6,7};dizi[2] = new int[]{8,9};

for(int i =0 ; i<dizi.GetLength(0) ; ++i)for(int j = 0 ; j<dizi[i].GetLength(0) ; ++j)

Console.WriteLine(dizi[i][j])

Düzensiz dizilerin elemanlarına ulaşım daha zordur. Çünkü bu tür dizilerin kolon sayısı sabit değildir.

Page 126: C# Akademi 2005

126 (http://www.csharpnedir.com)

System.Array SınıfıGüzel özellikleri ve metotları vardır. BinarySearch Clear Clone Copy CopyTo GetLength GetValue IndexOf Reverse SetValue Sort CreateInstance

Length Rank IsReadOnly IsFixedSize

Özellikler

Metotlar

Page 127: C# Akademi 2005

127 (http://www.csharpnedir.com)

CreateInstance() Metodu1-) CreateInstance(Type, int, int, int); Bu metod ile parametre ile verilen eleman sayılarda Type türünden 3 boyutlu diziler oluşturulur.

2-) CreateInstance(Type, int); Type türünden int ile verilen sayı kadar elemanı olan bir dizi nesnesi oluşturulur.

3-) CreateInstance(Type, int[]); Çok boyutlu diziler oluşturmak için kullanılır. Çok boyutlu dizilerin herbirinin kaç elemanlı olduğunu belirlemek için int türden bir dizi metoda parametre olarak gönderilir.

4-) CreateInstance(Type, int, int); Parametre olarak verilen boyutlarda iki boyutlu dizi nesnesi oluşturur.

Bu şekilde oluşturulan dizilerin elemanlarına nasıl ulaşırız?

Page 128: C# Akademi 2005

128 (http://www.csharpnedir.com)

Temel dizi işlemleri1-) Dizilerin başka dizilere kopyalanması. (Copy Metodu)

2-) Dizilerinin elemanlarını sıralama (Sort Metodu)

3-) Dizilerde arama (BinarySearch metodu)

4-) Dizi elemanlarını ters çevirme (Reverse metodu)

Page 129: C# Akademi 2005

129 (http://www.csharpnedir.com)

ÖrnekHerhangi bir türden dizinin elemanlarını Array sınıfının Reverse() metodunu kullanmadan ters çeviren bir program yazınız.

Kitaplar kapalı!

Örneğin dizi = {1,2,3,4,5,6} ise sonuç {6,5,4,3,2,1} olmalı

Page 130: C# Akademi 2005

130 (http://www.csharpnedir.com)

Metod Nedir? Programın her hangibir yerinde kullanılmak

için belirli bir işi yerine getirmek amacıyla tasarlanmış alt programlara denir.

Kaynak kodların tekrar kullanılabilirliğini sağlayan yapılardır.

Page 131: C# Akademi 2005

131 (http://www.csharpnedir.com)

Bir Metodun Genel Yapısı

•parametreler işlenir.•işlemler yapılır.•bir sonuç üretilir.

Metod Gövdesi

Parametreler Sonuç(Geri dönüş değeri)

Bir metod az ve öz iş yapmalıdır.

Page 132: C# Akademi 2005

132 (http://www.csharpnedir.com)

Metod BildirimiGeri Dönüş Tipi Metodun Adı

Metoda gönderilenparametreler.

Sonuçu geri döndürtenanahtar sözcük.

static int MetodAdi ( int a, string c);{

return ( a + c );

}

Page 133: C# Akademi 2005

133 (http://www.csharpnedir.com)

static void Main(string[] args){

Yaz("Burak");Yaz(10.2f);Yaz(12212);Yaz('c');

}

static void Yaz ( object parametre ){

Console.WriteLine(parametre.ToString());}

?Metodlar

Page 134: C# Akademi 2005

134 (http://www.csharpnedir.com)

Geri dönüş değeri olmayan metodlarda, return anahtar sözcüğü kullanılabilir mi? ?

static void Yaz(object parametre){

Console.WriteLine(parametre.ToString());return;

}

Metodlar

Page 135: C# Akademi 2005

135 (http://www.csharpnedir.com)

static void Yaz(int a,int b){

return a+b;}

Aşağıdaki kod neden çalışmaz? ?Metodlar

Page 136: C# Akademi 2005

136 (http://www.csharpnedir.com)

static void Main(string[] args){

float a=10;Yaz(a);

}static void Yaz(int a){

Console.WriteLine(a);}

Aşağıdaki kod neden çalışmaz? ?Metodlar

Page 137: C# Akademi 2005

137 (http://www.csharpnedir.com)

static void Main(string[] args){

float a=10;int b=(int)a;Yaz(b);

}static void Yaz(int a){

Console.WriteLine(a);static int Topla(int a){

Console.WriteLine(a);}

}

Aşağıdaki kod neden çalışmaz? ?Metodlar

Page 138: C# Akademi 2005

138 (http://www.csharpnedir.com)

static void Main(string[] args){

float a=10;}static void Yaz(int a,b){

Console.WriteLine(a);}

Aşağıdaki kod neden çalışmaz? ?Metodlar

Page 139: C# Akademi 2005

139 (http://www.csharpnedir.com)

static void Yaz(int a,int b){

int a;}

Aşağıdaki kod neden çalışmaz? ?Metodlar

Page 140: C# Akademi 2005

140 (http://www.csharpnedir.com)

Verilen iki sayının en büyüğünü bulanbir metod. ?

Metodlar

Page 141: C# Akademi 2005

141 (http://www.csharpnedir.com)

Metod Bildirimi Metodlar isimlendirilirken değişken isimlendirmedeki kurallara uyulur. Bir başka Main metodunu tanımlayamayız. Metodlar çağırılırken parametereler eksiksiz girilmelidir. Metodların geri dönüş değeri herhangibir türden olabilir. Geri dönüş değeri olmayan metodlar void olarak tanımlanır. Metodların geri dönüş değerlerini uyumlu türden bir nesneye atamak

gerekir. Void olarak tanımlanmış metodlarda return anahtar kelimesi kullanılmaz. Geri dönüş değerlerinde söz konusu olan gizli tür dönüşümleri ve tür

uyumsuzlukları parametreler içinde geçerlidir. Parametre almayan metodlar tanımlanabilir. Bir metod içinde başka bir metod bildirilemez. Metod içinde tanımlı değişkenler metod dışında geçersizdir. Metod parametrelerinin her birinin türü tek tek belirtilmelidir. Virgül

kullanımı geçersizdir. Metod parametreleri metodun gövdesinde yeniden bildirilemez.

Page 142: C# Akademi 2005

142 (http://www.csharpnedir.com)

Metod Parametresi Olarak Diziler

static void DiziYaz ( int[] dizi){

foreach(int i in dizi){

Console.WriteLine(i);}

}static void Main(){

int[] dizi={1,2,3,4};DiziYaz (dizi);

}

Page 143: C# Akademi 2005

143 (http://www.csharpnedir.com)

Herhangibir tipteki bir dizinin tüm elemanlarını ekrana yazdıracak bir metod. ?

static void Yazdir ( Array dizi ) {foreach(object eleman in dizi)

Console.WriteLine(eleman.ToString());}[STAThread]static void Main(string[] args){

int[] dizi1=new int[3];dizi1[0]=1;dizi1[1]=2;dizi1[2]=3;float[] dizi=new float[2];dizi[0]=1.454f;dizi[1]=1.2323f;Yazdir(dizi1);Yazdir(dizi);}

Metodlar

Page 144: C# Akademi 2005

144 (http://www.csharpnedir.com)

Metodlar Herhangibir tipteki bir dizinin tüm

elemanlarını ekrana yazdırırken ikinci bir parametre ile dizi elemanlarını dikey veya yatay yazdıracak bir metod.

?

Page 145: C# Akademi 2005

145 (http://www.csharpnedir.com)

Değer ve Referans Parametreleri Değer tipleri metodlara parametre olarak aktarılırken bit

bit kopyalanarak aktarılırlar. Metod içinde bu değerin değiştirlmesi orjinal değeri etkilemez.

static void DegerTipi( int Deger ){

Deger=50;}static void Main(){

int a=10;Console.WriteLine(a);

DegerTipi(a);

Console.WriteLine(a);}

10

10

Page 146: C# Akademi 2005

146 (http://www.csharpnedir.com)

Değer ve Referans Parametreleri Referans tipleri metodlara parametre olarak aktarılırken bit bit

kopyalanmaz. Kopyalanan sadece referansın heap’ te işaret ettiği adrestir. Metod içinde bu değerin değiştirlmesi orjinal değeride etkiler.

static void DegerTipi( string[] Deger ){

Deger[0]=“50”;}static void Main(){

string[] a={“10”,”5”,”4”};Console.WriteLine(a[0]);

DegerTipi(a);

Console.WriteLine(a[0]);}

10

50

Page 147: C# Akademi 2005

147 (http://www.csharpnedir.com)

ref ve out Anahtar Sözcükleri Değer tiplerini metodlara referans olarak aktarmaya

zorlamak için ref ve out anahtar sözcükleri kullanılır.

static void DenemeRef ( ref int x ){

x = 50 ;}static void Main(){

int x=10;

DenemeRef( ref x);Console.WriteLine(x);

}50

ref ile tanımlanmış parametrelere ilk değer verilmek zorundadır.

Page 148: C# Akademi 2005

148 (http://www.csharpnedir.com)

ref ve out Anahtar Sözcükleri out anahtar sözcüğü parametre için ilk değer verme

zorunluluğunu ortadan kaldırır.

static void DenemeRef ( out int x ){

x = 50 ;}static void Main(){

DenemeRef( out x);Console.WriteLine(x);

}50

Page 149: C# Akademi 2005

149 (http://www.csharpnedir.com)

Metodların Aşırı Yüklenmesi

Aynı(benzer) amaca hizmet eden, aynı isimde birden fazla metodun oluşturulmasına, metodların aşırı yüklenmesi denir.

Derleyici aynı isimli metodları ayırt etmek için, metod imzalarına bakar.

Page 150: C# Akademi 2005

150 (http://www.csharpnedir.com)

Metodların Aşırı Yüklenmesi

static void Metod1 ( int x, int y ){...}

static void Metod1 ( float x, float y){...}static void Metod1 (string x, string y){...}

Metod imzası, parametre sayısı ve parametrelerin veri tiplerinden oluşur.

Metodun geri dönüş değerinin metod imzasında bir rolü yoktur.

Metod İmzası;

Page 151: C# Akademi 2005

151 (http://www.csharpnedir.com)

Overloading Toplam metodu için overloading.

İki integer değeri toplayacak. İki double değeri toplayacak. Integer bir dizideki tüm elemanları

toplayacak. İki string değeri metinsel olarak

birleştirecek.

?

Page 152: C# Akademi 2005

152 (http://www.csharpnedir.com)

static void Yaz ( int bicim, params int[ ] sayilar ){...}

Değişken Sayıda Parametre Alan Metodlar

Bir metoda değişken sayıda parametre aktarmak için params anahtar kelimesi kullanılır. Bu sayede istediğimiz

sayıda parametreyi metoda gönderebiliriz.

static int Toplam ( params int[ ] sayilar ){...}

Page 153: C# Akademi 2005

153 (http://www.csharpnedir.com)

static void Yaz ( int bicim, object b ){...}

Değişken Sayıda Parametre Alan Metodlar

Değişken sayıda parametre içeren metodlar, aşırı yüklenmiş metodlar olduklarında değerlendirmeye alınmazlar.

static int Yaz ( int bicim, params object[ ] o ){...}

Yaz ( 0, 5 );iki parametre alıyor. Her iki Yaz metodunada uyar. Ancak params metod imzasında dikkatealınmadığından, ikinci Yaz metodu çağırılır.

Yaz ( 0 , 5 , 3 , 4 ); Ancak şimdi params içeren metod çağırılır.

Page 154: C# Akademi 2005

154 (http://www.csharpnedir.com)

Özyinelemeli (Recursive) Metodlar

Metod gövdesinden kendisini çağıran metodlara denir.

Page 155: C# Akademi 2005

155 (http://www.csharpnedir.com)

Özyinelemeli (Recursive) MetodlarFaktöryel Hesabı ; n! = n.(n-1).(n-2).(n-3);

static int Faktoryel ( int a ){

if (a==0)return 1;

return a * Faktoryel ( a – 1 );}3!Faktoryel ( 3 );

3 * Faktoryel ( 2 );

3 * 2 * Faktoryel ( 1 );

3 * 2 * 1 * Faktoryel ( 0 );

6

Page 156: C# Akademi 2005

156 (http://www.csharpnedir.com)

Main Metodu Main metodu programın çalışmaya

başladığı noktadır. Main metodununda aşırı yüklenmiş

versiyonları vardır.

Page 157: C# Akademi 2005

157 (http://www.csharpnedir.com)

Main Metodu Main metodu geri dönüş değerine sahip olabilir. Main metodu parametre alarak, komut satırı

argümanlarının program içinde kullanılabilmesine olanak sağlar.

static int Main ( string [ ] args ){

for ( int i=0; i < args.Length ; ++i ){...}

}

Page 158: C# Akademi 2005

158 (http://www.csharpnedir.com)

Main Metodu Main metodu komut satırından 3 parametre

alacak. 1ncisi 4 işlemi temsil eden bir değer.

(char) 2nci ve 3üncü parametreler ise 4 işlem

için gerekli operandlar.

?

Page 159: C# Akademi 2005

159 (http://www.csharpnedir.com)

Uygulama Kendisine değişken sayıda parametre olarak

gelen bütün sayıların karekökünü bir diziye aktarıp, bu dizinin referansı ile geri dönecek bir metod.

?

Page 160: C# Akademi 2005

160 (http://www.csharpnedir.com)

Fibonacci Dizisini belirli bir değer için hesaplayan program.

0 1 1 2 3 5 8 13 24...

Fibonacci(n)=Fibonacci(n-1)+Fibonacci(n-2)

?Uygulama - Fibonacci

Page 161: C# Akademi 2005

161 (http://www.csharpnedir.com)

Uygulama - Fibonaccistatic int Fibo(int deger){

if(deger==0)return 0;

if(deger==1)return 1;

return Fibo(deger-1)+Fibo(deger-2);}[STAThread]static void Main(string[] args){

for(int i=1;i<=8;i++){

Console.Write(Fibo(i).ToString()+" ");}

}

Page 162: C# Akademi 2005

162 (http://www.csharpnedir.com)

Sınıflar Nesne Yönelimli Programlama tekniğinin

temel yapı taşıdır. Sınıflar birer veri yapısıdır. Programcıya

bir veri modeli sunar. Bu veri modeli yardımıyla nesneler oluşturulur.

Page 163: C# Akademi 2005

163 (http://www.csharpnedir.com)

Sınıflar

class KrediHesabi

{

public ulong HesapNo;public double Limit;public string KartSahibi;

}

sınıf tanımlamaları class anahtar sözcüğü ile başlar.

sınıfın adı

Sınıfın üye elemanlarıözellikler(değişkenler) ve metodlardır.

Erişim belirleyicileri ; public, private, protected, internalveya protected internal. Varsayılan erişim belirleyici değeriprivate ‘ tır.

Page 164: C# Akademi 2005

164 (http://www.csharpnedir.com)

Sınıf Nesneleri Tanımlama

Sınıf tanımlamaları için bellekte yer ayrılmaz. Sınıf tanımı, oluşturulan nesnelerin, derleyiciyi için neye benzeyeceğini gösterir.

class KrediHesabi{

public ulong HesapNo;public double Limit;public string KartSahibi;

}class AnaSinif{

static void Main(){

KrediHesabi hesap = new KrediHesabi ( ) ;

hesap.HesapNo=565656556;hesap.Limit=100000000;hesap.KartSahibi=“Sefer Algan”;

}}

Bir sınıf nesnesi oluşturmakiçin new anahtar sözcüğükullanılır.

Sınıf üye elemanlarına

ulaşmak için . operatörükullanılır.

Sınıf Tanımı

Page 165: C# Akademi 2005

165 (http://www.csharpnedir.com)

Sınıf Üyelerinde Erişim Belirleyicilerin Rolüclass KrediHesabi{

private ulong HesapNo;double Limit;

public string KartSahibi;}class AnaSinif{

static void Main(){

KrediHesabi hesap = new KrediHesabi ( ) ;

hesap.HesapNo=565656556;hesap.Limit=100000000;hesap.KartSahibi=“Sefer Algan”;

}}

Bu üyelere, private oldukları içinsadece KrediHesabisınıfından erişilebilir.

Sınıf Tanımı

public üyelere diğer sınıflardandaerişilebilir.

KrediHesabi.Limit is inaccessibledue to its protection level.

Page 166: C# Akademi 2005

166 (http://www.csharpnedir.com)

Sınıf Nesneleri Arası Atama

class AnaSinif{

static void Main(){

KrediHesabi hesap1 = new KrediHesabi ( ) ;KrediHesabi hesap2;

hesap1.HesapNo=4545454;

hesap2=hesap1;

hesap2.HesapNo=1111111;}

}

Hesap2 nesnesi tanımlandı ancakbellekte henüz yer tahsis edilmedi.

Hesap2 nesnesi artık Hesap1 nesnesininheap’te gösterdiği adresireferans eder.

Page 167: C# Akademi 2005

167 (http://www.csharpnedir.com)

Sınıf Nesneleri Arası AtamaKrediHesabi hesap1 = new KrediHesabi();KrediHesabi hesap2;

Stack Heap

@

@

hesap1

hesap2 HesapNo

Limit

Kart Sahibi

Page 168: C# Akademi 2005

168 (http://www.csharpnedir.com)

Sınıf Nesneleri Arası Atamahesap2 = hesap1 ;

Stack Heap

@

@

hesap1

hesap2 HesapNo

Limit

Kart Sahibi

Page 169: C# Akademi 2005

169 (http://www.csharpnedir.com)

Sınıflara Metod Eklemekclass Dortgen{

public int En;public int Boy;

public void EnBoyBelirle ( int e, int b ){

En=e;Boy=b;

}

public int Alan ( ){

return En*Boy;}

}

class tanımı

metod tanımı

metod tanımı

Erişim Belirleyicileri Geri Dönüş Tipi Metod Adı Parametreler

Page 170: C# Akademi 2005

170 (http://www.csharpnedir.com)

Dörtgen Sınıfı Kare ve dikdörtgenlerin alanının hesaplayacak

Alan metodu. Dörtgenin En ve Boy alanları. Dörtgenin En ve Boy alanlarınını değerlerini

belirleyecek metod. Dörtgene ait verileri (en, boy, alan) yazdıracak

metod.

Dörtgen Sınıfı

?

Page 171: C# Akademi 2005

171 (http://www.csharpnedir.com)

EnBoyBelirle metoduna neden ihtiyacımız var?

Metodlar

? Cevap : Dortgen sınıfı içindeki, en ve boy alanlarına

girilen değerlerin belirli bir aralıkta olup olmadığını kontrol edebilmek için.

Page 172: C# Akademi 2005

172 (http://www.csharpnedir.com)

Özellik Tanımlama

Özellikler, sınıf içi alanların, dış ortamdan saklanması bir başka deyişle kapsüllenerek erişimlerinin kontrol altına alınmasını sağlar.

Page 173: C# Akademi 2005

173 (http://www.csharpnedir.com)

Özellik Tanımlamaclass Dortgen{

private int mEn;private int mBoy;

public int En{

get{

return mEn;}set{

if ( value < 0 )mEn=0;

elsemEn= value ;

}}

...

Bu sınıf dışından bu alanlaradoğrudan erişilemez.

Özellik tanımı.

alanın değerini döndürür.

alana değer verir.

alana atanacak değeri temsil eder.

Page 174: C# Akademi 2005

174 (http://www.csharpnedir.com)

Özellikleri Kullanmak

Dortgen d1=new Dortgen ();

d1. En = 25 ;

d1. Boy = 40;

Console.WriteLine ( d1 . En ) ; Console.WriteLine ( d1 . Boy ) ;

özelliklerin değerleriatanıyor.

En özelliğinin set bloğuçalışır. value değeri 25olur.

Boy özelliğinin set bloğuçalışır. value değeri 40olur.

Boy ve en özelliklerinindeğerilerine erişiliyor. get blokları çalışır.return ile değer geri döner.

Page 175: C# Akademi 2005

175 (http://www.csharpnedir.com)

Dortgen Sınıfının TekrarıSınıfın Üyeleri

Özellikler

Metodlar

private En

private Boy

public int Alan

public void EnBoyBelirle

public void Yaz

public bool Karemi

public double KosegenBul

Page 176: C# Akademi 2005

176 (http://www.csharpnedir.com)

Yapıcı Metodlar ( Constructors ) Bir nesne dinamik olarak oluşturulduğunda

otomatik olarak çalıştırılan metodlardır. Nesnenin üye elemanlarına ilk değerlerini

vermek yada sınıf nesnesi için gerekli kaynak düzenlemeleri yapmak için kullanılırlar.

Her sınıfın biz tanımlasakta tanımlamasakta otomatikolarak oluşturulan varsayılan bir yapıcı metodu

( default constructor ) vardır.

Page 177: C# Akademi 2005

177 (http://www.csharpnedir.com)

Yapıcı Metodlar ( Constructors )

class Zaman{

...public Zaman ( int h, int m, int s ){

Saat = h;Dakika = m;Saniye = s;

}...

}

Yapıcı metodların ismi sınıf ismi ile aynı olmalıdır.

Yapıcı metodların geri dönüş değeri yoktur.

Geri dönüş değerinin olmaması metodun

void olduğu anlamına gelmez.

Yapıcı metodlarparametreler alabilir.

Yapıcı Metod

Geri dönüş değeri kavramı olmadığı içinreturn anahtar kelimesi kullanılmamıştır.

Page 178: C# Akademi 2005

178 (http://www.csharpnedir.com)

Yapıcı Metodun Çağırılması

public Zaman ( int h , int m , int s ) yapıcısını çağırır.

Zaman z = new Zaman ( 5 , 59 , 60 ) ;

int h

int m

int s

Page 179: C# Akademi 2005

179 (http://www.csharpnedir.com)

Varsayılan Yapıcı MetodlarHer sınıf nesnesinin en az bir

varsayılan yapıcı metodu vardır.

Varsayılan yapıcı metodlar herhangibir parametre almazlar.

Nesnelerin üye elemanlarına varsayılan değerlerini atarlar.

Varsayılan yapıcı metodu kendimizde yazabiliriz. Bu durumda derleyicinin önerdiği varsayılan yapıcı yerine bizim yazdığımız varsayılan yapıcı çağırılır.

Page 180: C# Akademi 2005

180 (http://www.csharpnedir.com)

Varsayılan Yapıcı Metodlarclass Zaman{

...public Zaman ( ){

Saat = 4 ;Dakika = 10 ;Saniye = 15 ;

}...

}...

Zaman z = new Zaman ( )

Varsayılanyapıcı

Varsayılan yapıcılarparametre almazlar.

Zaman sınıfınınvarsayılan yapıcı metodunuçalıştırır.

Page 181: C# Akademi 2005

181 (http://www.csharpnedir.com)

Herhangibir sınıftan herhangibir nesne örneğinin oluşturulmasını nasıl önleriz? İspat ediniz.

Yapıcı Metodlar

?

Page 182: C# Akademi 2005

182 (http://www.csharpnedir.com)

Yapıcı Metodların Aşırı Yüklenmesiclass Zaman{

...public Zaman (int h , int m , int s ){

Saat = h ;Dakika = m ;Saniye = s;

}

public Zaman ( int h , int m ){

Saat = h ;Dakika = m ;Saniye = 0;

}...

}

Aşırı yüklenmiş yapıcıların ayırt edilmesinde, her zaman olduğu gibi metod imzaları rol oynar.

Zaman z = new Zaman (1,15,59);

Zaman z = new Zaman (1,15);

Page 183: C# Akademi 2005

183 (http://www.csharpnedir.com)

Yapıcı Metodlarda This Anahtar Sözcüğü

class Zaman{

...public Zaman (int h , int m , int s ){

Saat = h ;Dakika = m ;Saniye = s;

}

public Zaman ( int h , int m ) : this ( h , m , 0 ) {}public Zaman ( int h ) : this (h , 0 , 0 ){}...

}

Page 184: C# Akademi 2005

184 (http://www.csharpnedir.com)

Bir nesneyi, başka bir nesneden nasıl örneklendirebiliriz ?

Yapıcı Metodlar

?

Page 185: C# Akademi 2005

185 (http://www.csharpnedir.com)

Kopyalayıcı Yapıcı Metodlar

class Zaman{

...public Zaman ( Zaman Yeni ){

Saat = Yeni . Saat ;Dakika = Yeni . Dakika ;Saniye = Yeni . Saniye ;

}...

}

Bir sınıf nesnesini yine bir sınıf nesnesi ile oluşturmak için kullanılır.

Bu metodlar tek bir parametre alır. Bu parametresınıf türünden nesnelerdir.

Page 186: C# Akademi 2005

186 (http://www.csharpnedir.com)

Soru

Zaman z1=new Zaman(4,53,12);Zaman z2=new Zaman(2,45,68);

z2=z1;

z2.S=5;

z1.Yaz();

Bu kodun ekran çıktısı ne olur? Neden ?

Page 187: C# Akademi 2005

187 (http://www.csharpnedir.com)

Yıkıcı Metodlar ( Destructors ) Yıkıcı Metodlar, Garbage Collector bir nesne için bellekte ayrılan

alanı kaynağa iade etmesinden hemen önce çalışır. Bir sınıfın sadece bir yıkıcı metodu olabilir.

class Zaman{

...

~ Zaman ( ){

}...}

Yıkıcı metodların isimleride,yapıcalarda olduğu gibi sınıf ismiile aynıdır.

Yıkıcı metod adları ~ karakteri ile başlar.

Yıkıcı metodlar parametre almazlar.

Page 188: C# Akademi 2005

188 (http://www.csharpnedir.com)

Yıkıcı Metodlarclass Yikici{

~Yikici() {

Console.WriteLine("Yıkıcı Metod çağırıldı"); }

}class Class1{

static void Main(string[] args){

{Yikici y=new Yikici();

}Console.WriteLine("Bir seyler");}

}

Page 189: C# Akademi 2005

189 (http://www.csharpnedir.com)

Statik Metodlar Statik metodlar, bir işlevi gerçekleştirmek için, bir nesne

tanımlanmasına gerek olmadığı durumlarda kullanılır.class Cebir{

public static int Topla ( params int[] dizi ){

int toplam=0;

for ( int i = 0; i<dizi.Length; i++){

toplam += dizi[i];}

return toplam;}

}

static metodlarstatic anahtar sözcüğüile tanımlanır.

Page 190: C# Akademi 2005

190 (http://www.csharpnedir.com)

Statik Metodlarint t;

t = Cebir . Topla ( 4 , 5 , 6 ) ;

Static metodlara erişmek için, nesne tanımlamaya gerek yoktur.Static metoda, sınıf adı ve nokta notasyonu yardımıyla erişilir.

Static bir metod içinden normal bir sınıf metodu çağırılamaz. Ancak bir static metod içinden başka bir static metod çağırılabilir.

Nesneler ile doğrudan iş yapmayan metodları static olarak tanımlarız.

Page 191: C# Akademi 2005

191 (http://www.csharpnedir.com)

Static Yapıcı MetodlarStatic yapıcılar, bir sınıfın static değişkenleri ile ilgili işlemlerde kullanılır.

class Oyuncu{

public Oyuncu( ){

}

static Oyuncu ( ){

}}

staticyapıcımetod

static yapıcı metodlar parametre almazlar.

public gibi bir erişim belirleyicisine sahip olamazlar.

Bir nesneyi hangi yapıcı metod ile oluşturursak oluşturalım, static yapıcı metod ilk nesne yaratıldığında bir kez çalıştırılır.

Page 192: C# Akademi 2005

192 (http://www.csharpnedir.com)

Üçü bir arada.public class Statik{

public static int a;public static string b;public static bool c;

public Statik(){}static Statik(){}

}class Class1{

[STAThread]static void Main(string[] args){

Console.WriteLine(Statik.a);Console.WriteLine(Statik.b);Console.WriteLine(Statik.c);

}}

? Bu kodun ekran çıktısı ne olur?

Page 193: C# Akademi 2005

193 (http://www.csharpnedir.com)

Üçü bir arada.int a;

public static void Metod(){

a=Convert.ToInt32(Console.ReadLine());int b=a/2;Console.WriteLine(b.ToString());

}[STAThread]static void Main(string[] args){

Metod();}

? Bu kodun ekran çıktısı ne olur?

Page 194: C# Akademi 2005

194 (http://www.csharpnedir.com)

Üçü bir arada.class Oyuncu{

public static int Toplam;

public Oyuncu(){

Oyuncu.Toplam++;}

static Oyuncu(){

Toplam=0;}

~Oyuncu(){

Toplam--;}

}

Varsayılan yapıcı

static yapıcı

yıkıcı

Page 195: C# Akademi 2005

195 (http://www.csharpnedir.com)

Üçü bir arada.class AnaSinif{

static void Main(){

Oyuncu o = new Oyuncu ( ) ;

Console.WriteLine ( Oyuncu . Toplam ) ;

Oyuncu x = new Oyuncu ( ) ;}

}

? Bu kod nasıl çalışır?

Page 196: C# Akademi 2005

196 (http://www.csharpnedir.com)

Const Elemanlar Programın çalışması sırasında değerinin değişmeyeceği

düşünülen değişkenler, sabit olarak tanımlanır.

public const double PI = 3.14 ;

sabitler const anahtar kelimesi ile tanımlanır.

sabitlere mutlakailk değer verilmelidir.

Sabit ifadeleri çalışma zamanında değiştirilemez.

Console.WriteLine ( Cebir . PI ) ;

sabitlere nesneler üzerinden değil sınıf nokta notasyonu ile erişilebilir.

Page 197: C# Akademi 2005

197 (http://www.csharpnedir.com)

Const Elemanlar Sabitler referans tiplerine uygulanamaz.

public const string a = “ Burak “ ;

Sabitler referans tiplerinden sadece string türlerine new anahtar sözcüğü kullanılmadığı takdirde uygulanabilir. Bir sınıfa veya başka bir referans tipine uygulanamaz

? İstisnai bir durum olabilir mi?

Page 198: C# Akademi 2005

198 (http://www.csharpnedir.com)

ReadOnly Elemanlar ReadOnly elemanlar, referans tiplerini sabit olarak tanımlamak

istediğimiz durumlarda kullanılır. Readonly elemanların değerleri çalışma zamanında yada derleme

aşamasında değiştirilemez.

static readonly Deneme a = new Deneme ( ) ;

Sabitler ile readonly elemanlar arasındaki tek fark, sabitler için ilk değer verilmesinin derleme zamanında, readonly elemanlar içinse çalışma zamanıda yapılmasıdır.

Page 199: C# Akademi 2005

199 (http://www.csharpnedir.com)

Operatörlerin Aşırı Yüklenmesi

Operatör metodları static olmalıdır. Operatör metodlarının isimleri için operator anahtar

sözcüğü kullanılır. En az bir paremetre almalıdırlar. Operatör metodlarıda aşırı yüklenebilir. Operatör metodları ref ve out anahtar sözcüklerini

kullanmamalıdır.

Operatörleri, onlara yeni anlamlar yüklemek için aşırı yükleriz.

Kurallar;

?

?

Neden

Neden

Page 200: C# Akademi 2005

200 (http://www.csharpnedir.com)

Kompleks SınıfıTanı; Kompleks sınıfı kompleks sayıları temsil edicek nesneler için bir veri modeli oluşturacak.

Kompleks sayıların bir sanal birde gerçel kökü var. Bunlar Kompleks sınıfının özellikleri olucak.

Kompleks sınıfı için aritmetik işlemler kompleks sayılardaki temellere dayanacak. Bunun için kompleks sınıfına aritmetik operatörleri yeniden bildireceğiz.

a + b j

Gerçel Kök Sanal Kök

Page 201: C# Akademi 2005

201 (http://www.csharpnedir.com)

İki Kompleks Sayının Toplamı

public static Kompleks operator+ (Kompleks a, Kompleks b){

double gercekToplam=a.GercekKok+b.GercekKok;

double sanalToplam=a.SanalKok+b.SanalKok;

return (new Kompleks(gercekToplam,sanalToplam));}

Kompleks sayılar için + operatörünün aşırı yüklenmesi

Page 202: C# Akademi 2005

202 (http://www.csharpnedir.com)

İki Kompleks Sayının Toplamıstatic void Main(string[] args){

Kompleks k1=new Kompleks(-1,6);Kompleks k2=new Kompleks(3,4);Console.WriteLine("1nci Kompleks sayi");k1.Yaz();Console.WriteLine("2nci Kompleks sayi");k2.Yaz();Kompleks k3;k3=k1+k2;Console.WriteLine("Toplam");k3.Yaz();

}

Page 203: C# Akademi 2005

203 (http://www.csharpnedir.com)

İlişkisel Operatörlerin Aşırı Yüklenmesi != , == , < , > , <= , >= operatörlerini aşırı yükleyebiliriz. Tek kural;

zıt anlamlı operatörlerin her ikisininde aynı anda aşırı yüklenmiş olması gerekliliğidir.

Yani == operatörünü aşırı yükleyecek isek, != operatörünüde aşırı yüklemeliyiz.

Page 204: C# Akademi 2005

204 (http://www.csharpnedir.com)

İlişkisel Operatörlerin Aşırı Yüklenmesi

İki kompleks sayının birbirine eşit olup olmadığını bulmak için ne yaparsınız ?

?

Page 205: C# Akademi 2005

205 (http://www.csharpnedir.com)

İlişkisel Operatörlerin Aşırı Yüklenmesipublic static bool operator==(Kompleks a, Kompleks b){

if(a.SanalKok==b.SanalKok && a.GercekKok==b.GercekKok)return true;

elsereturn false;

}public static bool operator!=(Kompleks a, Kompleks b){

return !(a==b);}

İlişkisel operatörlerin geri dönüşdeğerinin boolean olması tercih edilir.

Zıt operatörlerin aynı anda tanımlanması gerekir.

Page 206: C# Akademi 2005

206 (http://www.csharpnedir.com)

true ve false Operatörlerinin Aşırı Yüklenmesi

public static bool operator true (Kompleks a){

if (a.GercekKok!=0 || a.SanalKok!=0)return true;

elsereturn false;

}public static bool operator false (Kompleks a){

if (a.GercekKok==0 && a.SanalKok==0)return true;

elsereturn false;

}

Page 207: C# Akademi 2005

207 (http://www.csharpnedir.com)

Mantıksal Operatörlerin Aşırı Yüklenmesi

& , | , || , && , ! operatörlerini aşırı yükleyebiliriz. && ve || operatörlerini doğrudan aşırı yükleyemeyiz.

Dolaylı olarak aşırı yüklenebilmeleri için gerekli şartlar; & ve | operatörleri aşırı yüklenmelidir. true ve false operatörleri aşırı yüklenmelidir. operator& ve operator| metodlarının parametreleri ilgili

sınıf türünden olmalıdır. operator& ve operator| metodlarının geri dönüş

değerleri ilgili sınıf türünden olmalıdır.

Page 208: C# Akademi 2005

208 (http://www.csharpnedir.com)

Dönüşüm Operatörlerinin Aşırı Yüklenmesi

Kompleks a = new Kompleks();int sayi=a;

Kompleks sınıfından bir nesneyi, bir değişkene aktarabilmemiz için, gerekli olan tür dönüşüm operatörlerinin aşırı yüklenmesi gereklidir.

Page 209: C# Akademi 2005

209 (http://www.csharpnedir.com)

Dönüşüm Operatörlerinin Aşırı Yüklenmesi

public static implicit operator double ( Kompleks a ){

return a.GercekKok;}

public static explicit operator double ( Kompleks a ){

return a.GercekKok;}

Bilinçli tür dönüşümü için explicit anahtar sözcüğü kullanılır.

Bilinçsiz tür dönüşümü için implicit anahtar sözcüğü kullanılır.

Bir sınıf için hem explicit hemde implicit tür dönüştürme operatörlerini aynı anda bildiremeyiz.

Page 210: C# Akademi 2005

210 (http://www.csharpnedir.com)

Dönüşüm Operatörlerinin Aşırı Yüklenmesipublic static implicit operator double ( Kompleks a ){

return a.GercekKok;}

public static explicit operator double ( Kompleks a ){

return a.GercekKok;}

Kompleks k=new Kompleks();double a;

a = k;

Kompleks k=new Kompleks();double a;

a = ( double ) k;

Tür dönüşüm operatörünün implicit olarak belirlenmesi, sınıf nesnesinin explicittür dönüşüm operatörlerinide otomatik olarak desteklemesini sağlar.

Page 211: C# Akademi 2005

211 (http://www.csharpnedir.com)

Dönüşüm Operatörlerinin Aşırı YüklenmesiTür dönüşüm operatörünün implicit olarak belirlenmesi, sınıf nesnesinin explicit tür dönüşüm operatörlerinide otomatik olarak desteklemesini sağlar. Yani;

public static implicit operator double ( Kompleks a ){

return a.GercekKok;}

double a=k3;

double b=(double)k3;

Bilinçsiz dönüşüm.

Bilinçli dönüşüm.

Page 212: C# Akademi 2005

212 (http://www.csharpnedir.com)

Aşırı Yükleme Yapamıyacağımız Operatörler && || [] () = ? . ?: is sizeof new typeof atama ve işlemli atama operatörleri

Page 213: C# Akademi 2005

213 (http://www.csharpnedir.com)

Indeksleyiciler (indexers) Nesneleri birer diziymiş gibi kullanmamızı sağlarlar.

İndeksleyiciler genellikle, sınıfımızın üye elemanlarından birisi dizi olduğunda, dizi elemanlarına [ ] operatörü yardımıyla erişmek için kullanılır.

Page 214: C# Akademi 2005

214 (http://www.csharpnedir.com)

Indeksleyiciler (indexers)public class Indeks{

public double sayi;

public double this [ double indeks ]{

get{

return indeks*indeks;}set{

sayi=value;}

}}

Indeksleyici tanımı.

Page 215: C# Akademi 2005

215 (http://www.csharpnedir.com)

Indeksleyiciler (indexers)Indeks i=new Indeks();

Console.WriteLine("i[1.2]= {0} ", i [ 1.2 ] );

i[4]=8;

Console.WriteLine("i[4]= {0} ",i.sayi);

get bloğunuçalıştırır. 1.2 * 1.2 =1.44döndürür.set bloğunu

çalıştırır. sayi = 8 olur.

Page 216: C# Akademi 2005

216 (http://www.csharpnedir.com)

Indeksleyicilerin Aşırı Yüklenmesi indeksleyiciler aşırı yüklenerek sınıf içindeki birden fazla

diziye [ ] operatörü ile erişilebilir.

indeksleyicilerin aşırı yüklenmesi metodlarda olduğu gibidir. Ayırt edici özellik parametrelerdir.

public double this [ double indeks ]{

...}public int this [ int indeks ]{

...}

Page 217: C# Akademi 2005

217 (http://www.csharpnedir.com)

Çok Boyutlu Indeksleyicilerprivate int[,] diziCok;

public int this [ int in1 , int in2 ]{

get{

return diziCok [ in1 , in2 ];}set{

diziCok [ in1 , in2 ] = value;}

}

Page 218: C# Akademi 2005

218 (http://www.csharpnedir.com)

Yapılar (Structs) Birbirleriyle ilişkili değişkenleri bir arada tutmak amacıyla

kullanılan değer tipinden verilerdir. Sınıflar gibi metodlar, alanlar, özellikler, indeksleyiciler

içerebilirler. Sınıflar referans tipinden olup heap bölgesini kullanırken,

yapılar değer tipinden olup stack bölgesini kullanırlar.

Page 219: C# Akademi 2005

219 (http://www.csharpnedir.com)

Yapılar (Structs)struct Eleman{

public string ad;private int ssn;public void Yaz(){Console.WriteLine("Ad : "+ad);}public int SSN{get{return ssn;}set{ssn=value;}}

}

Yapılar struct anahtarsözcüğü ile tanımlanır. alanlar

metod

özellik

Page 220: C# Akademi 2005

220 (http://www.csharpnedir.com)

Yapılar (Struct)

static void Main(string[] args){

Eleman e=new Eleman();

e.ad="Burak Selim";e.SSN=214545;e.Yaz();

}

Yapı değişkenlerini new operatörü ile oluşturabiliriz. Bu durumda yapıdaki değişkenlere varsayılan değerleri atanır.

Page 221: C# Akademi 2005

221 (http://www.csharpnedir.com)

Yapılar (Structs) Yapı değişkenlerini new operatörü kullanmadanda

tanımlayabiliriz. Ancak bu durumda yapı değişkenlerine değerleri teker teker atanmalıdır.

Eleman e2;

Console.WriteLine( e2.ad );

“Use of possibly unassigned field no”

Page 222: C# Akademi 2005

222 (http://www.csharpnedir.com)

Eleman Burak=new Eleman();

Burak.ad="Burak Selim";

Burak.SSN=919191;

Eleman Sefer=Burak;

Sefer.ad="Sefer";

Console.WriteLine(Burak.ad); Ekrana ne yazar?

Yapılar (Structs)

?

Page 223: C# Akademi 2005

223 (http://www.csharpnedir.com)

Yapılarda Yapıcı Metodlar Yapılarda varsayılan yapıcı metodları biz bildiremeyiz. Sadece parametre alan yapıcılar bildirebiliriz. Yapıcıları aşırı yükleyebiliriz. Bir yapıcı metod tanımladığımızda bütün yapı

değişkenlerine ilk değerlerini atamamız gerekir.

public Eleman (string a, int s){

ad=a;ssn=s;

}

Yapıcı adı yapı adı ile aynı olmalıdır.

Yapılar için yıkıcı metodlar bildirilemez. Neden?

Page 224: C# Akademi 2005

224 (http://www.csharpnedir.com)

Yapıların Avantajları Stack bellek bölgesinde bir değişken için yer ayırmak,

aynı işi heap bölgesinde yapmaktan daha hızlıdır. Sınıf nesneleri GC ile heap alanından silinir. Yapılar ise,

yapı nesnesinin faaliyet alanı dışında çıkıldığında bellekten otomatik olarak silinir.

Stack bölgesinde bulunan değişkenlerin kopyalanması daha hızlıdır.

Page 225: C# Akademi 2005

225 (http://www.csharpnedir.com)

Numaralandırıcılar (Enumerators)

Çeşitli sembolleri tamsayılar ile ifade etmek için kullanılan bir veri yapısıdır.

Enum sabitleri, yazılardan oluşan sembolleri kendi belirlediğimiz numara sistemine göre numaralandırır.

Page 226: C# Akademi 2005

226 (http://www.csharpnedir.com)

Numaralandırıcılar (Enumerators)

enum GUN : byte{

PAZARTESI,SALI,CARSAMBA,PERSEMBE,CUMA,CUMARTESI,PAZAR

}

Enum sabitlerienum anahtar sözcüğüile tanımlanır.

Enum sabitinin adı.

Enum sabitlerindeki elemanların karşılık geldiği sayıların varsayılan tipi int dir. Ancak byte, sbyte, short, ushort, int, uint, long, ulong tipindende olabilirler.

Enum sabitlerinineleman sayısı, belirtilenveri türünün izin verdiğisayı kadardır. byte için255.

0

1

2

6

Page 227: C# Akademi 2005

227 (http://www.csharpnedir.com)

Numaralandırıcılar (Enumerators)enum BICIM:byte{

DIKEY,YATAY

}...static void DiziYaz(Array dizi, BICIM b ){

foreach(object i in dizi){

if(b== BICIM . DIKEY )Console.WriteLine(i.ToString());

elseConsole.Write(i.ToString());

}static void Main(string[] args){

int[] a=new int[5]{1,3,4,5,7};DiziYaz(a, BICIM . DIKEY );DiziYaz(a, BICIM . YATAY );

}}

Numaralandırıcı Tanımı

Bu ifade b==0 ile aynıdır.

Page 228: C# Akademi 2005

228 (http://www.csharpnedir.com)

Numaralandırıcılar (Enumerators)Dilersek numaralandırıcı elemanlarına karşılık düşen sayıları ayarlayabiliriz.

enum NOT:byte{

PEKIYI=5,IYI=4,ORTA=3,ZAYIF=2,BASARISIZ=1

}...int not=Convert.ToInt32(Console.ReadLine());if(not>=80 && not<=100){

Console.WriteLine("Karne notu {0}", ( int ) NOT . PEKIYI );}

NOT.PEKIYI nin karşılığı olan sayıyı verir.

Page 229: C# Akademi 2005

229 (http://www.csharpnedir.com)

İsim Alanları (Namespace) İsim alanı, benzer amaçlara yönelik sınıfları bünyesinde

barındırdan bir kaptır. İsim alanları sayesinde, aynı isimli elemanları

tanımlayabilir ve kullanabiliriz.

namespace1

namespace2

Musteri Sınıfı

Musteri Sınıfı

Page 230: C# Akademi 2005

230 (http://www.csharpnedir.com)

İsim Alanları (Namespace)

namespace isimAlanAdi{

}

isim alanları namespace anahtar kelimesi ile bildirilirler.

isim alanlarında,Sınıf ( Class )Temsilci ( Delegate )Numaralandırıcı ( Enumerator )Yapı ( Struct )Arayüz ( Interface )tanımlamaları yapılabilir.

isim alanlarında metod bildirimi yada değişken tanımlaması yapılamaz.

Page 231: C# Akademi 2005

231 (http://www.csharpnedir.com)

İsim Alanları (Namespace)using System;namespace CSharpNedir{

public class Deneme{

public int x;public int y;public Deneme(int x,int y){

this.x=x;this.y=y;

}}

}

İsim alanı bloğu

Page 232: C# Akademi 2005

232 (http://www.csharpnedir.com)

İsim Alanları (Namespace)using System;namespace isimAlan{ class Class1 {

static void Main(string[] args){

CSharpNedir.Deneme d=new CSharpNedir.Deneme(5,6);

Console.WriteLine(d.x);}

}}

Başka bir isim alanı içindekisınıfa erişim.

Page 233: C# Akademi 2005

233 (http://www.csharpnedir.com)

İsim Alanları (Namespace)using System;using CSharpNedir;

namespace isimAlan{

class Class1{

static void Main(string[] args){

Deneme d=new Deneme(5,6);Console.WriteLine(d.x);

}}

}

Page 234: C# Akademi 2005

234 (http://www.csharpnedir.com)

İsim Alanları (Namespace)Grafik2D

Grafik3DNokta

Nokta

Page 235: C# Akademi 2005

235 (http://www.csharpnedir.com)

Using Anahtar Sözcüğü Uygulamalarımızda isim alanları altındaki elemanlara

daha kısa bir yazım tarzı ile erişmek için kullanılır. using bloğu içine alınan nesnelerin, blok sonunda

dispose metodları çağırılarak kesin olarak bellekten atılmasını sağlar.

sınıflar için takma isimler bildirebiliriz.

Page 236: C# Akademi 2005

236 (http://www.csharpnedir.com)

Using Anahtar Sözcüğüusing System;namespace CSharpNedir{

public class Deneme : IDisposable{

public int x;public int y;public Deneme(int x,int y){

this.x=x;this.y=y;

}public void Dispose(){

Console.WriteLine("dispose çağırıldı");}

}}

using bloğundaki nesnelerin blok sonunda kaynağa geri iade edilebilmesi için, nesneye IDisposable arayüzünün uygulanması gerekir.

Page 237: C# Akademi 2005

237 (http://www.csharpnedir.com)

Using Anahtar Sözcüğü

static void Main(string[] args){

using(CSharpNedir.Deneme d=new CSharpNedir.Deneme(5,6)){

Console.WriteLine(d.x);Console.WriteLine("using bloğu");

}Console.WriteLine("using bloğu sonrası");

}

Nasıl Çalışır??

Page 238: C# Akademi 2005

238 (http://www.csharpnedir.com)

Using Anahtar Sözcüğünamespace Grafik2D{

public class Nokta{

public Nokta(){

Console.WriteLine("Grafik2D Nokta");}

}}namespace Grafik3D{

public class Nokta{

public Nokta(){

Console.WriteLine("Grafik3D Nokta");}

}}

Page 239: C# Akademi 2005

239 (http://www.csharpnedir.com)

Using Anahtar Sözcüğü

class Class1{

static void Main(string[] args){

Nokta n=new Nokta();}

}

?

Page 240: C# Akademi 2005

240 (http://www.csharpnedir.com)

Using Anahtar Sözcüğüusing Nokta2D=Grafik2D.Nokta;

using Nokta3D=Grafik3D.Nokta;

namespace isimAlan{

class Class1{

static void Main(string[] args){

Nokta2D n2d=new Nokta2D();

Nokta3D n3d=new Nokta3D();}

}}

Page 241: C# Akademi 2005

241 (http://www.csharpnedir.com)

İç İçe Geçmiş (Nested) İsim Alanları

namespace A{...

namespace B{...}

...

}

İsim alanları başka isim alanlarıda içerebilir.

using A;

using A.B;

Page 242: C# Akademi 2005

242 (http://www.csharpnedir.com)

Tarih ve Zaman İşlemleriSystem NameSpace

DateTime Sınıfı

TimeSpan Sınıfı

Gün ,ay ,yıl, saat, dakika, saniye gibi bilgileri tutar.

İki tarih arasındaki farkı temsil eden üyelere sahiptir.

Page 243: C# Akademi 2005

243 (http://www.csharpnedir.com)

DateTime Yapısının Bazı ÜyeleriDateTime Sınıfının Önemli Üyeleri

Date Saat dışında günün tarihini verir.

Month Ay bilgisini verir. (int)

Day Gün bilgisini verir. (int)

Year Yıl bilgisini verir (int)

DayOfWeek Haftanın kaçıncı günü olduğunu verir.

DayOfYear Yılın kaçıncı günü olduğunu verir.

TimeOfDay 00:00:00 dan itibaren ne kadar zaman geçtiğini verir.

Hour Saat bilgisini verir (int)

Minute Dakika bilgisini verir (int)

Second Saniye bilgisini veriri (int)

MilliSecond Mili saniye bilgisini verir (int)

Ticks 1 Ocak 0001 00:00:00 ile DateTime nesnesindeki zaman arasındaki 100 nanosaniyelerin sayısını veriri.

MinValue En alt tarih sınırını verir.

MaxValue En üst tarih sınırını verir.

Page 244: C# Akademi 2005

244 (http://www.csharpnedir.com)

Bir DateTime Nesnesinin Oluşturulması

DateTime dt=new DateTime(700000000);Console.WriteLine(dt);

DateTime dt2=new DateTime(2004,4,17,12,00,00,System.Globalization.Calendar.CurrentEra);Console.WriteLine(dt2);

DateTime dt3=new DateTime(1976,12,4);Console.WriteLine(dt3);

DateTime dt4=new DateTime(1976,12,4,12,00,58);Console.WriteLine(dt4);

ticks

Page 245: C# Akademi 2005

245 (http://www.csharpnedir.com)

TimeSpan Yapısı

İki DateTime nesnesinin farkını temsil eden yapıdır. İki DateTimenesnesi arasındaki fark bir TimeSpan nesnesidir.

DateTime d1=new DateTime(2004,12,01);DateTime d2=new DateTime(1999,12,04);TimeSpan fark=d1-d2;Console.WriteLine("Gün farkı "+fark.Days);

Page 246: C# Akademi 2005

246 (http://www.csharpnedir.com)

TimeSpan Yapısı

Bir DateTime nesnesi ile bir TimeSpan nesnesini toplayabiliriz.

int GunSayisi=Convert.ToInt32(Console.ReadLine());

TimeSpan Fark=new TimeSpan(GunSayisi,0,0,0);

DateTime d3=DateTime.Today+Fark;

Console.WriteLine(d3.DayOfWeek);

Page 247: C# Akademi 2005

247 (http://www.csharpnedir.com)

Verilen iki tarih arasında geçen hafta sonu günlerinin sayısını bulan bir program yazın??

TimeSpan Yapısı

Page 248: C# Akademi 2005

248 (http://www.csharpnedir.com)

BitConverter SınıfıIsLittleEndian Özelliği

true false

Most Significant Byte Least Significant Byte

Little EndianBig Endian

INTEL

Page 249: C# Akademi 2005

249 (http://www.csharpnedir.com)

BitConverter SınıfıEn önemli metod : GetBytes() . Bu metod ile, bool, char, int, long, double shor, uint, ulong, ushort türünden değişkenlerin değerlerini byte türünden bir diziye aktarırız.

int a=987456;byte[] aDizi=BitConverter.GetBytes(a);

foreach (byte i in aDizi)Console.Write(i+" ");

Page 250: C# Akademi 2005

250 (http://www.csharpnedir.com)

Convert Sınıfı Convert sınıfı ile veri kaybı olmayacak şekilde tüm türler

arası dönüşüm yapılabilmektedir. Çoğunlukla string verileri, sayısal verilere dönüştürmek

için kullanılır.

Page 251: C# Akademi 2005

251 (http://www.csharpnedir.com)

Buffer Sınıfı Tür bilgisinden bağımsız şekilde, byte düzeyinde işlemler

yapılır. Örneğin bir dizinin belirli alanlarının başka bir diziye kopyalanırken tür bilgisine bakılmaması gibi.

Page 252: C# Akademi 2005

252 (http://www.csharpnedir.com)

Buffer Sınıfıbyte[] kaynak={1,2,3,1};short[] hedef=new short[10];

Buffer. BlockCopy ( kaynak,0,hedef,0,4);foreach(short i in hedef)Console.Write(i+" ");

Hedef dizinin sadece iki elemanı 0 dan farklı. Neden??

Page 253: C# Akademi 2005

253 (http://www.csharpnedir.com)

Buffer Sınıfıhedef[0] kaynak[1]kaynak[0]

0 0 0 0 0 0 1 00 0 0 0 0 0 0 1 513 (2) (1)

hedef[1] kaynak[3][kaynak[2]

0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 259 (1) (3)

BlockCopy kopyalama işlemini byte düzeyinden yaptığı için, kaynak dizinin her iki elemanı hedef dizisinde bir eleman düşücektir.

Page 254: C# Akademi 2005

254 (http://www.csharpnedir.com)

Buffer Sınıfı

static int ByteLength(Array dizi)

verilen bir dizi içindeki toplam byte sayısını döndürür.

static byte GetByte(Array dizi,int index)

dizi[index] elemanından itibaren ilk byte değerini döndürür.

static void SetByte(Array dizi, int index, byte deger)

dizi[index] elemanından itibaren bir byte’ lık alana değer sayısını yazar.

Page 255: C# Akademi 2005

255 (http://www.csharpnedir.com)

GC Garbage Collector Sınıfı İstediğimiz bir anda Garbage Collector mekanizmasının

devreye girmesini sağlayabiliriz.

Programın herhangibir anında o ana kadar tahsis edilmiş bellek alanının byte cinsinden değerini görebiliriz.

GC.Collect();

GC.GetTotalMemory();

Page 256: C# Akademi 2005

256 (http://www.csharpnedir.com)

C# I/O Sistemi I/O Sistemi stream adı verilen akımlar üzerine

kuruludur. C# ta akımlar ile ilgili işlemler System.IO isim

alanından bulunan Stream sınıfı ile yapılır.

Page 257: C# Akademi 2005

257 (http://www.csharpnedir.com)

Dosya ve Klasör İşlemleri

Directory Class

File Class

Path Class

FileInfo Class

DirectoryInfo Class

Page 258: C# Akademi 2005

258 (http://www.csharpnedir.com)

Directory Sınıfı Klasörler ile ilgili işlemler yapmamızı sağlar. Bütün metodları statictir. Hiç bir özelliği yoktur.

Page 259: C# Akademi 2005

259 (http://www.csharpnedir.com)

Directory Sınıfı DirectoryInfo CreateDirectory (string yol)

yol değişkeni ile belirtilen adreste bir klasör oluşturur.

Page 260: C# Akademi 2005

260 (http://www.csharpnedir.com)

Directory Sınıfı void Delete (string yol)

void Delete (string yol,bool a)

bool Exist (string yol)

yol değişkeni ile belirtilen adresteki boş klasörü siler.

yol değişkeni ile belirtilen adresteki klasörü (ikinci parametre true ise içindekiler ile birlikte ) siler.

yol değişkeni ile belirtilen adreste klasörün bulunup bulunmadığını belirtir.

Page 261: C# Akademi 2005

261 (http://www.csharpnedir.com)

Directory Sınıfı string GetCurrentDirectory()

string[ ] GetDirectories(string yol)

bool GetDirectoryRoor (string yol)

çalışan programın klasörünü verir.

yol değişkeni ile belirtilen adresteki tüm klasörlerin listesini string dizisi olarak döndürür.

yol değişkeni ile belirtilen adresin kök (root) bilgisini ve volume bilgisini verir.

Page 262: C# Akademi 2005

262 (http://www.csharpnedir.com)

Directory Sınıfı string[ ] GetFiles(string yol)

string[ ] GetFileSystemEntries(string yol)

DateTime GetLastAccesTime(string yol)

yol ile belirtilen klasördeki dosyaların listesini string dizi olarak döndürür.

yol değişkeni ile belirtilen adresteki tüm klasörlerin ve dosyaların listesini string dizisi olarak döndürür.

yol değişkeni ile belirtilen adresteki klasöre en son ne zaman erişildiğini belirtir.

Page 263: C# Akademi 2005

263 (http://www.csharpnedir.com)

Directory Sınıfı string[ ] GetLogicalDrivers()

DirectoryInfo GetParent(string yol)

void Move(string kaynak_yol,string hedef_yol)

bilgisayardaki tüm sürücülerin listesini verir.

yol değişkeni ile belirtilen adresin bir üst klasörünün bilgilerini DirectoryInfı nesnesi olarak döner.

taşıma işlemini yapar.

Page 264: C# Akademi 2005

264 (http://www.csharpnedir.com)

Directory Sınıfı DateTime SetLastAccesTime(string yol, DateTime zaman) DateTime SetLastWriteTime(string yol, DateTime zaman) DateTime SetCreationTime(string yol, DateTime zaman) void SetCurrentDirectory ( string yol )

Bütün yol ifadelerinde tam yol gibi göreceli yol da bulunabilir.

Page 265: C# Akademi 2005

265 (http://www.csharpnedir.com)

File Sınıfı StreamWriter AppendText(string yol)

void Copy(string kaynak,string hedef)

void Copy(string kaynak,string hedef,bool üstüne yaz)

kaynakta belirtilen dosya hedefe kopyalanır.

kaynak ile hedef aynı dosya ise, hedefin üstüne üçüncü parametre true ise yazılır.

Page 266: C# Akademi 2005

266 (http://www.csharpnedir.com)

File Sınıfı FileStream Create(string yol)

StreamWriter CreateText(string yol)

Belirtilen yolda dosya oluşturulur.

belirtilen yolda üzerinde yazmak için bir text dosyası oluşturulur.

Page 267: C# Akademi 2005

267 (http://www.csharpnedir.com)

File Sınıfı FileAttributes GetAttributes(string yol)

belirtilen yoldaki dosyanın özelliklerini döndürür.

string[] dizi=Directory.GetFileSystemEntries(@"d:\");foreach(string i in dizi){

Console.Write(i+"-->");Console.WriteLine(File.GetAttributes(i));

}

Page 268: C# Akademi 2005

268 (http://www.csharpnedir.com)

File Sınıfı FileStream Open(string yol, FileMode a) FileStream Open(string yol, FileMode a,FileAccess b) FileStream Open(string yol, FileMode a,FileAccess b,

FileShare c)

belirtilen yoldaki dosyayı açar.

Page 269: C# Akademi 2005

269 (http://www.csharpnedir.com)

File SınıfıFileMode Enumerator

Append Açılan dosyanın sonuna ekleme yapar. Dosya yok ise oluşturulur.

Create Yeni bir dosya yaratır. Dosya var ise üzerine yazar.

CreateNew Yeni bir dosya yaratır. Ancak dosya var ise hata verir.

Open Dosya açılır.

OpenOrCreate Dosya varsa açılır yoksa yenisi yaratılır.

Truncate Belirtilen dosya açılır ve içi tamamen silinir.

Page 270: C# Akademi 2005

270 (http://www.csharpnedir.com)

File SınıfıFileAccess Enumerator

Read Dosya okumak için açılır.

ReadWrite Dosya okumak ve yazmak üzere açılır.

Write Dosya sadece yazmak için açılır

Page 271: C# Akademi 2005

271 (http://www.csharpnedir.com)

File SınıfıFileShare Enumerator

Inheritable Dosyanın yavur proseslerce türetilebilmesi sağlanır.

None Dosyanın başka proseslerce açılması engellenir.

Read Dosyanın başka proseslerce açılabilmesi sağlanır.

ReadWrite Dosyanın başka proseslerce açılabilmesi ve üzerine yazılabilmesi sağlanır.

Write Dosyanın başka proseslerce yazılabilmesi sağlanır.

Page 272: C# Akademi 2005

272 (http://www.csharpnedir.com)

File Sınıfı FileStream OpenRead(string yol)

belirtilen dosyayı yanlızca okumak için açar.

StreamReader OpenText(string yol)

belirtilen dosyayı yanlızca text modunda okumak için açar.

FileStream OpenWrite(string yol)

belirtilen dosyayı yazma modunda açar.

Page 273: C# Akademi 2005

273 (http://www.csharpnedir.com)

DirectoryInfo Bir dizin ile ilgili bilgileri elde etmek için

kullanılır.

Page 274: C# Akademi 2005

274 (http://www.csharpnedir.com)

DirectoryInfo Sınıfı void Create()

klasör oluşturur.

DirectoryInfo di=new DirectoryInfo(@"d:\deneme");di.Create();

DirectoryInfo CreatesSubDirectory(string yol)

belirtilen yolda bir alt dizin oluşturur.

void Delete()

klasörün içi boşsa silinir.

void Delete(bool a)

a true verilirse klasör içindekiler ile birlikte silinir.

Page 275: C# Akademi 2005

275 (http://www.csharpnedir.com)

DirectoryInfo Sınıfı DirectoryInfo[ ] GetDirectories()

ilgili klasördeki bütün dizinleri DirectoryInfo türünden dizi şeklinde döndürür.

FileInfo[ ] GetFiles()

ilgili klasördeki bütün dosyaları FileInfo türünden dizi olarak döndürür.

void MoveTo(string hedef)

ilgili dizini içindekiler ile birlikte hedef adrese taşır.

void Refresh()

ilgili klasörü sistemden tekrar yükler.

Page 276: C# Akademi 2005

276 (http://www.csharpnedir.com)

FileInfo Sınıfı Tek bir dosya ile ilgili özellikleri içerir.

Page 277: C# Akademi 2005

277 (http://www.csharpnedir.com)

Path Sınıfı String olarak aldığı bir yol bilgisi üzerinde

çeşitli işlemler yapan static üyelere sahiptir.

Page 278: C# Akademi 2005

278 (http://www.csharpnedir.com)

Dosya Yazma ve Okuma İşlemleri

Bir dosyadan byte düzeyinde bir veri almak için FileStream sınıfı kullanılır.

StreamReader ve StreamWriter sınıflarıda text tabanlı dosyalardan okuma ve yazma yapmak için tasarlanmıştır.

BinaryReader ve BinaryWriter sınıfları ise binary(ikili) dosyalarda işlem yapmak için kullanılır.

StringReader ve StringWriter sınıflarıda dosyadan formatlı bir şekilde yazı okumak veya dosyaya formatlı bir şekilde yazı yazmak için kullanılır.

Page 279: C# Akademi 2005

279 (http://www.csharpnedir.com)

FileStream Sınıfı FileStream sınıfı ile diskte bulunan bir dosya

açılır, StreamWriter ve StreamReader sınıfları yardımıyla dosya üzerinde işlemler yapılar.

Dosyalar üzerinde text tabanlı işlemler yapabileceğimiz gibi byte düzeyinde işlemlerde yapabiliriz.

Page 280: C# Akademi 2005

280 (http://www.csharpnedir.com)

FileStream Sınıfı

string yol = @"D:\dosya.txt";

FileStream fs1 = new  FileStream(yol,FileMode.OpenOrCreate);

FileStream fs2 = new FileStream(yol,FileMode.OpenOrCreate,FileAccess.Write);

FileStream fs3 = new FileStream(yol,FileMode.OpenOrCreate,FileAccess.Write,FileShare.None);

Bir FileStream nesnesi çok değişik yollardan oluşturulabilir.

Page 281: C# Akademi 2005

281 (http://www.csharpnedir.com)

FileStream Sınıfı

FileInfo fi1 = new FileInfo(yol);FileStream fs4 = fi1.OpenRead();

FileInfo fi2 = new FileInfo(yol);FileStream fs5 = fi2.OpenWrite();

FileInfo fi3 = new FileInfo(yol);FileStream fs6 = fi3.Create();

FileInfo fi4 = new FileInfo(yol);FileStream fs7 = fi4.Open(FileMode.OpenOrCreate);

Bir FileStream nesnesi çok değişik yollardan oluşturulabilir.

Page 282: C# Akademi 2005

282 (http://www.csharpnedir.com)

FileStream Sınıfı ile Okuma ve Yazma

Okuma Metodları

int ReadByte()

Bu metot ile akımdan bir byte’lık bilgi okunur ve akımdaki okuma pozisyonunu bir artırır ki bir sonraki okumada tekrar aynı byte değeri okunmasın. Okunan byte değeri int türüne dönüştürülür ve bu değer ile geri dönülür.

int Read(byte[] dizi, int baslangic, int adet)

Bu metot ile adet kadar byte dizisi akımdan okunur, okunan bu veriler, byte dizisine dizi[baslangic] elemanından itibaren yerleştirilir. Geri dönüş değeri okunan byte miktarını verir.

Page 283: C# Akademi 2005

283 (http://www.csharpnedir.com)

FileStream İle Okuma ve Yazmastring yol = args[0];

FileStream fs = new FileStream(yol,FileMode.Open);

int OkunanByte;

while( ( OkunanByte = fs . ReadByte ( ) ) ! = -1 ){

Console.Write((char)OkunanByte);}

Page 284: C# Akademi 2005

284 (http://www.csharpnedir.com)

FileStream İle Okuma ve YazmaFileReader.cs dosyasının bütün içeriğini aşağıdaki gibi konsola yazdırmış oluyoruz.

Page 285: C# Akademi 2005

285 (http://www.csharpnedir.com)

FileStream İle Okuma ve YazmaKomut satırından dosyanın yanlış girilmesi yada dosyanın bulunamaması gibi durumlarda ne olur??

Page 286: C# Akademi 2005

286 (http://www.csharpnedir.com)

FileStream Sınıfı ile Okuma ve Yazma

Yazma Metodları

void WriteByte(byte veri)

Dosya akımına bir byte’ lık bilgi yazmak için kullanılır.

void Write (byte[] dizi, int baslangıc, int adet)

Dosya akımına bir byte dizisi yazdırmak için kullanılır.

Page 287: C# Akademi 2005

287 (http://www.csharpnedir.com)

FileStream Sınıfı ile Okuma ve Yazma Dosya akımına yazılan veriler dosya sistemindeki dosyaya

hemen aktarılmaz. Dosya akımı tamponlama mekanizması ile çalıştığı için

belirli bir miktar kadar veri yazılana kadar dosya güncellenmez.

Ancak FileStrem() sınıfının Flush() metodunu kullanarak istediğimiz anda tamponu boşaltıp dosyayı tampondaki bilgilerle güncelleyebiliriz.

Page 288: C# Akademi 2005

288 (http://www.csharpnedir.com)

FileStream Sınıfı ile Okuma ve Yazma

Komut satırından girilen dosyanın girilen bir şifreye göre her byte’ı XOR işlemine tabi tutulacak.

XOR işleminin geri dönüşümlü olmasından dolayı aynı şifre ile, şifrelenmiş dosyayı tekrar açabileceğiz.

?

Page 289: C# Akademi 2005

289 (http://www.csharpnedir.com)

FileStream Sınıfının Özellikleri

bool CanReadBu özellikle akımdan okunma yapılıp yapılamayacağı öğrenilir.

bool CanSeekBu özellikle akımda konumlandırma yapılıp yapılamayacağı öğrenilir.

bool CanWriteBu özellikle akımda yazma yapılıp yapılamayacağı öğrenilir.

long PositionBu özellikle akımda o anda bulunan konum bilgisi öğrenilir.

long LengthBu özellikle akımın byte olarak büyüklüğü öğrenilir.

Page 290: C# Akademi 2005

290 (http://www.csharpnedir.com)

FileStream Sınıfının Metodlarıvoid Lock(long pozisyon, long uzunluk)

Bu metot ile akımın pozisyondan itibaren uzunluk kadar alanı başka proseslerin erişimine engellenir.

long Seek(long ofset, SeekOrigin a)

Akımın konumu SeekOrigin ile belirtilmiş konumdan ofset byte kadar ötelenir. Seek() metodunu kullanarak dosya akım konumlandırıcısını istediğimiz şekilde değiştirebiliriz. Bu sayede dosya akımının istenilen bölgesinden veri okuma şansına sahip oluruz.

Page 291: C# Akademi 2005

291 (http://www.csharpnedir.com)

Dosya Akımı İle Text İşlemleri Text tabanlı dosyalarla işlem yapmak için StreamReader

ve StreamWriter sınıfları mevcuttur. Bu sınıflar ile bir dosya akımı okunduğunda akım

otomatik olarak text moduna çevrilir.

Page 292: C# Akademi 2005

292 (http://www.csharpnedir.com)

StreamReader Nesnesistring dosya = @"D:\dosya.txt";

FileStream fs = new FileStream(dosya,FileMode.Open);StreamReader sr1 = new StreamReader(fs);

StreamReader sr2 = new StreamReader(dosya);

FileInfo fi = new FileInfo(dosya);StreamReader sr3 = new StreamReader(fi);

Page 293: C# Akademi 2005

293 (http://www.csharpnedir.com)

StreamReader NesnesiÖnemli Metodları

string ReadLine()Akımdan bir satırlık veriyi okur ve string türü olarak geri döner.

string ReadToEnd() Akımdaki verilerin tamamını string olarak geri döndürür.

int Read() Akımdan bir bir karekterlik bilgi okunur, ve bu karekterin int’e dönüşmüş hali ile geri dönülür.

int Read(char[] dizi, int indeks, int adet)

Akımdan adet kadar karekteri, dizi[indeks] elemanından itibaren diziye yerleştirir.

int Peek()Akımdan bir bir karekterlik bilgi okur, ve bu karekterin int’e dönüşmüş hali ile geri dönülür.

Page 294: C# Akademi 2005

294 (http://www.csharpnedir.com)

StreamReader Nesnesi

string dosya = "Dosya.txt";

FileStream fs = new FileStream(dosya,FileMode.Open);

StreamReader sr = new StreamReader(fs);

string Line;

while( ( Line = sr . ReadLine ( ) ) ! = null )Console.WriteLine(Line);

Page 295: C# Akademi 2005

295 (http://www.csharpnedir.com)

StreamWriter Sınıfı StreamWriter sınıfı bir akıma karekter tabanlı

bilgileri yazmak için kullanılır.

Page 296: C# Akademi 2005

296 (http://www.csharpnedir.com)

StreamWriter Sınıfı

string dosya = @"D:\dosya.txt";

FileStream fs = new FileStream(dosya,FileMode.Open);StreamWriter sr1 = new StreamWriter(fs);

StreamWriter sr2 = new StreamWriter(dosya);

FileInfo fi = new FileInfo(dosya);StreamWriter sr3 = fi.CreateText();

Page 297: C# Akademi 2005

297 (http://www.csharpnedir.com)

StreamWriter NesnesiÖnemli Metodları

void Write(string str) akıma str yazısı eklenir.

void WriteLine(string str)WriteLine() metodu akıma yazarken eklediği yazının sonuna ‘\n’ satır atlama karekterini de ekler.

void Flush()Tampondaki bilgilerin boşaltılmasını ve dosya sistemindeki dosyanın güncellenmesini sağlar.

Page 298: C# Akademi 2005

298 (http://www.csharpnedir.com)

StreamWriter Nesnesistring dosya = "Dosya.txt";FileStream fs = new FileStream(dosya,FileMode.Append,FileAccess.Write);

StreamWriter sw = new StreamWriter(fs);while(true){

string Line = Console.ReadLine();

if(Line.ToLower() == "q")break;

sw.WriteLine(Line);}sw.Flush();sw.Close();

Page 299: C# Akademi 2005

299 (http://www.csharpnedir.com)

BinaryWriter ve BinaryReader Bu sınıflar ile dosya akımına istediğimiz temel

veri türünden bilgileri yazabiliriz.

Page 300: C# Akademi 2005

300 (http://www.csharpnedir.com)

BinaryWriter ve BinaryReaderint i = 5;decimal d = 15.54M;char c = 'A';string dosya = "Dosya.txt";FileStream fs1 = new FileStream(dosya,FileMode.OpenOrCreate);BinaryWriter bw = new BinaryWriter(fs1);bw.Write(i);bw.Write(d);bw.Write(c);bw.Close();FileStream fs2 = new FileStream(dosya,FileMode.Open);BinaryReader br = new BinaryReader(fs2);Console.WriteLine(br.ReadInt32());Console.WriteLine(br.ReadDecimal());Console.WriteLine(br.ReadChar());br.Close();

Page 301: C# Akademi 2005

304 (http://www.csharpnedir.com)

Temel String (Karekter Dizisi) İşlemleri C#’ta string işlemlerinin tamamı System.String sınıfındaki

üye özellik ve metotlarla yapılır. Bir String nesnesi bir kere tanımlandıktan sonra, stringde

bulunan herhangi bir karekter bir daha değiştirilemez. Ancak string üzerinde çeşitli metotlar ile işlemler yapıp metotların geri dönüş değerleri yeni string nesnelerine aktarılabilir.

String’ de bulunan her karekter readonly özelliğine sahiptir.

Stringlerin içindeki karekterlere ulaşabilmek için bir indeksleyici tanımlanmıştır. Bu yüzden stringlerle bir karekter dizisi gibi işlem yapmamız mümkündür.

Page 302: C# Akademi 2005

305 (http://www.csharpnedir.com)

String Dizisi Tanımlama Yolları

string a = "CsharpNedir";

char[] dizi = {'1','2','3','4'};

String str = new String(dizi);

char[] dizi = {'1','2','3','4'};

String str = new String(dizi,1,2);

String str = new String(x, n); // n tane x karekteri içeren bir String nesnesi oluşturulur.

Page 303: C# Akademi 2005

306 (http://www.csharpnedir.com)

String MetodlarıString.Concat()

Concat() metodu bir stringin sonuna başka stringler eklemek için kullanılır.

//String Concat(String str1, String str2)String str1 = String.Concat("Sefer ","Algan");//String Concat(params string[] stringler)String str2 = String.Concat("a","b","b","1","4","K");//operator+String str3 = "Sefer " + "Algan";//String Concat(String str1, String str2, String str3)String str4 = String.Concat("C#","nedir","?com");//String Concat(object o2, object o1)String str5 = String.Concat(5,'c');

Page 304: C# Akademi 2005

307 (http://www.csharpnedir.com)

String MetodlarıString. Compare()

İki stringin karekter dizisini karşılaştırmak için Compare() metodu kullanılır.

int Compare(String str1, String str2)

str1, str2’den büyükse sıfırdan büyük bir değere geri dönülür. str2 büyükse sıfırdan küçük bir değere geri dönülür.

int Compare(String str1, String str2, bool BuyukKucuk)

Birinci metot ile aynı işi yapar, tek farkı büyük yada küçük harf duyarlılığını belirleyebilmemizdir.

int Compare(String str1, int index1, String str2, int index2, int adet)

Birinci metot ile aynı mantıkta çalışır. Tek farkı str1[index1] den itibaren adet kadar karekteri str2[index2] den itibaren adet kadar karekter ile karşılaştırmasıdır.

int Compare(String str1, int index1, String str2, int index2, int adet, bool BuyukKucuk)

Üçüncü metot ile aynı şekilde sonuç üretir. Aradaki fark, ikinci metotta da olduğu gibi büyük ve küçük harf duyarlılığının devreye girmesidir.

Page 305: C# Akademi 2005

308 (http://www.csharpnedir.com)

Arama İşlemleri

string yazi = "Pek yakında sinemalarda";Console.WriteLine(yazi.IndexOf("akın"));Console.WriteLine(yazi.IndexOf('k'));

IndexOf() metodu ile aranacak yazının yada karekterin ilk bulunduğu yerin indeksi ile geri döner. Arama işlemi başarısızsa –1 değerine geri dönülür.

Page 306: C# Akademi 2005

309 (http://www.csharpnedir.com)

Arama İşlemleri

string yazi = "Pek yakında sinemalarda";Console.WriteLine(yazi.LastIndexOf("akın"));Console.WriteLine(yazi.LastIndexOf('k'));

ise aranan karekterin yada yazının, aranacak yazı içinde en son nerde bulunduğunu söyler. Arama işlemi başarısızsa –1 değerine geri dönülür.

Page 307: C# Akademi 2005

310 (http://www.csharpnedir.com)

Arama İşlemleristring yazi = "Pek yakında sinemalarda";char[] dizi = {'a','k'};Console.WriteLine(yazi.IndexOfAny(dizi));Console.WriteLine(yazi.LastIndexOfAny(dizi));

Bu metotlar bir karekter dizisinin herhangi bir elemanının ilk bulunduğu yerin indeksi ile geri döner. Her iki metotta aranan karekter dizisinin hiçbir elemanını bulamazsa –1 değerine geri döner.

Page 308: C# Akademi 2005

311 (http://www.csharpnedir.com)

Arama İşlemleristring str1 = "AY";string str2 = "A";string yazi = "AYAAYAAYA";if(yazi.StartsWith(str1))

Console.WriteLine("Yazı AY ile başlıyor.");if(yazi.EndsWith(str2))

Console.WriteLine("Yazı A ile sonlanıyor.");

String, eğer StartsWith() metodunun parametre ile verilen yazı ile başlıyorsa true değeri döndürlür. Aynı durum EndsWith() metodu içinde geçerlidir. Tabi bu sefer stringin sonuna bakılır.

Page 309: C# Akademi 2005

312 (http://www.csharpnedir.com)

Split() ve Join() Metotları Bir yazı içerisinde düzenli bir şekilde devam eden alt

karekter dizilerini parçalara ayırarak string türden bir diziye yerleştirmek için Split() metodu kullanılır.

string str = "Ali,Mehmet,Sefer,Volkan,Ebru"; char[] ayirici = {','};string[] isimler = str. Split(ayirici);foreach(string i in isimler)

Console.WriteLine(i);

Page 310: C# Akademi 2005

313 (http://www.csharpnedir.com)

Split() ve Join() Metotları Split() metodunun tam tersi iş yapan Join() metodu da alt

karekter dizilerini belirlenen bir ayıracı göre birleştirip tek string haline getirir.

string[] str = {"Ali","Mehmet","Sefer","Volkan","Ebru"};string isimler = String.Join(",",str);

Console.WriteLine(isimler);

Page 311: C# Akademi 2005

314 (http://www.csharpnedir.com)

Diğer String İşlemleristring ToUpper() Yazının tamamını büyük harf

karekterlerine çevirir ve bu yeni yazı ile geri döner.

string ToLower() Yazının tamamını küçük harf karekterlerine çevirir ve bu yeni yazı ile geri döner.

Remove(int indeks, int adet)

Yazının “indeks” nolu karekterinden itibaren “adet” sayıda karekteri yazıdan siler ve bu yeni yazı ile geri döner.

string Insert(int indeks, string str)

Metodu çağıran yazının “indeks.” elemanından sonrasına str yazısı eklenir ve oluşan bu yazı ile geri dönülür.

Page 312: C# Akademi 2005

315 (http://www.csharpnedir.com)

Diğer String İşlemleristring Replace(char c1, char c2)

Yazıda geçen bütün ‘c1’ karekterlerinin yerine ‘c2’ karekteri yerleştirir ve bu oluşan yeni yazı ile geri dönülür.

string Replace(string str1, string str2)

Yazıda geçen bütün str1 yazılarını, str2 yazısı ile yer değiştirir ve bu oluşan yeni yazı ile geri döner.

string Substring(int indeks)

Metodu çağıran yazının indeks elemanından sonraki karekterlerini içeren yazıya geri döner.

string Substring(int indeks, int toplam)

Metodu çağıran yazının indeks elemanından sonraki toplam adet karekteri içeren yazıya geri döner.

Page 313: C# Akademi 2005

316 (http://www.csharpnedir.com)

Yazıları BiçimlendirmeBelirleyici Açıklama Duyarlılık Anlamı

C / c Para birimi Ondalık basamakların sayısı

D / d Tamsayı verisi En az basamak sayısını belirtir, gerektiğinde boş olan basamaklar sıfırla beslenir.

E / e Bilimsel Notasyon Ondalık basamak sayısını verir

F / f Gerçek sayılar(float)

Ondalık basamak sayısını verir

G / g E ve F biçimlerinden hangisi kısa ise o kullanılır

Ondalık basamak sayısını verir

N / n Virgül kullanarak gerçek sayıları yazar.

Ondalık basamak sayısını verir

Page 314: C# Akademi 2005

317 (http://www.csharpnedir.com)

Yazıları BiçimlendirmeBelirleyici Açıklama Duyarlılık Anlamı

P / p Yüzde Ondalık basamak sayısını verir

R / r Stringe dönüşen türün tekrar eski değerine geri dönmesini sağlayabilecek biçim

Yok

X / x Onaltılık sayı sisteminde yazar

En az basamak sayısını belirtir, gerektiğinde boş olan basamaklar sıfırla beslenir.

Page 315: C# Akademi 2005

318 (http://www.csharpnedir.com)

Yazıları Biçimlendirmefloat f = 568.87f;int a = 105;Console.WriteLine("{0:C3}",a);Console.WriteLine("{0:D5}",a);Console.WriteLine("{0:E3}",f);Console.WriteLine("{0:F4}",f);Console.WriteLine("{0:G5}",a);Console.WriteLine("{0:N1}",f);Console.WriteLine("{0:P}",a);Console.WriteLine("{0:X5}",a);

Page 316: C# Akademi 2005

319 (http://www.csharpnedir.com)

Yazıları BiçimlendirmeString.Format() ve ToString() Metotları ile Biçimlendirme

int a = 50;

string str = String. Format("{0:C3}",a);

Console.WriteLine(str);

string str = a. ToString("C3");

Console.WriteLine(str);

Page 317: C# Akademi 2005

320 (http://www.csharpnedir.com)

Yazıları Biçimlendirme

Tarih ve Saat Biçimlendirme

DateTime dt = DateTime.Now;Console.WriteLine("d--> {0:d}",dt);Console.WriteLine("D--> {0:D}\n",dt);Console.WriteLine("t--> {0:t}",dt);Console.WriteLine("T--> {0:T}\n",dt);Console.WriteLine("f--> {0:f}",dt);Console.WriteLine("F--> {0:F}\n",dt);Console.WriteLine("g--> {0:g}",dt);Console.WriteLine("G--> {0:G}\n",dt);Console.WriteLine("m--> {0:m}",dt);Console.WriteLine("M--> {0:M}\n",dt);Console.WriteLine("r--> {0:r}",dt);Console.WriteLine("R--> {0:R}\n",dt);Console.WriteLine("s--> {0:s}\n",dt);Console.WriteLine("u--> {0:u}",dt);Console.WriteLine("U--> {0:U}\n",dt);Console.WriteLine("y--> {0:y}",dt);Console.WriteLine("Y--> {0:Y}\n",dt);

Page 318: C# Akademi 2005

321 (http://www.csharpnedir.com)

Yazıları BiçimlendirmeÖzel Biçimlendirme Oluşturma

# Rakam değerleri için kullanılır., Büyük sayılarda binlikleri ayırmak için kullanılır.. Gerçek sayılardaki ondalık kısımlarda kullanılır.0 Yazılacak değerin başına yada sonuna 0 karekteri ekler.% Yüzde ifadelerini belirtmek için kullanılır.E0, e0, E+0,e+0,E-0,e-0 Yazıları bilimsel notasyonda yazmak için kullanılır.

Page 319: C# Akademi 2005

322 (http://www.csharpnedir.com)

Yazıları BiçimlendirmeÖzel Biçimlendirme Oluşturma

Console.WriteLine("1- ){0:#,###}",1554785);Console.WriteLine("2- ){0:#.##}",1554.785);Console.WriteLine("3- ){0:#,###E+0}",1554785);Console.WriteLine("4- ){0:#%}",0.25);

Page 320: C# Akademi 2005

331 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Nesne yönelim tekniği, gerçek hayatı programlar için

simule edecek yöntemler topluluğudur. Her nesnenin kendine has özellikleri vardır. Nesneler tamamen birbirlerinden soyutlanarak

farklılaştırılır. Nesne yönelimli programlama tekniğinde gerçek bir

sistem parçalara ayrılır ve bu parçalar arasında ilişkiler kurulur. Her bir parça hiyerarşik yapıda olabileceği gibi tamamen birbirinden bağımsız da olabilir.

Page 321: C# Akademi 2005

332 (http://www.csharpnedir.com)

Nesne Yönelimli ProgramlamaNesne yönelimli programlama tekniğinin en küçük yapı taşı nesnelerdir.

Nesnelerin, verileri bu şekilde içinde barındırması ve fonksiyonları içermesine encapsulation denilmektedir.

Page 322: C# Akademi 2005

333 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Nesnenin servislerinden faydalanabilmek için nesnenin dış

dünyaya sunduğu arayüzü bilmemiz yeterlidir. Nesne yönelimli teknik jargonunda buna Information Hiding(Bilgi Saklama) denilmektedir.

Page 323: C# Akademi 2005

334 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Derleme zamanında hangi nesnelerin hangi fonksiyonlarının

kullnılacağı belli olmayabilir. Bu durumda nesne yönelimli programlama tekniğinin çalışma

zamanında bağlama mekanizmasından faydalanılır.(late binding)

Page 324: C# Akademi 2005

335 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Nesnelerin hepsi sınıfların birer örneğidir. Sınıflar nesnenin ne şekilde olacağını belirler. Nesneler çalışma zamanında oluşturulabileceği gibi

derleme zamanında oluşturulabilir.

Page 325: C# Akademi 2005

336 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Kalıtım yolu ile sınıflar birbirlerinden türeyebilir. Bir sınıf

diğer bir sınıftan türediği zaman türediği sınıfın bütün özelliklerini içerir. Bunun yanında kendine has özellikleride barındarabilir. Nesne yönelimli programlama tekniğinin en önemli kavramı kalıtım yolu ile türetmedir.

Kalıtım yolu ile türetilmiş sınıflar ile hiyerarşik bir sınıf organizasyonu gerçekleştirebiliriz. Bunun en güzel örneği .NET sınıf kütüphanesidir.

Page 326: C# Akademi 2005

337 (http://www.csharpnedir.com)

Nesne Yönelimli Programlama Nesne yönelimli programla tekniği ile bir nesne çok biçimli

olabilir. Çok biçimlilik kavramıda türetme ile yakından alakalıdır ve

önemli bir kavramdır. Çok biçimlilik bir nesnenin farklı şekillerde davranabilmesidir. (Polymorphizm)

Page 327: C# Akademi 2005

338 (http://www.csharpnedir.com)

Diğer Programlama Teknikleri Nesne tabanlı programlama(Object-based Programming)

Veriler nesne içinde toplanmıştır. Sınıf, Kalıtım, Geç Bağlama teknikleri yoktur. ADA.

Sınıf tabanlı programlama(Class-based programming) Nesnelere ek olarak sınıf yapısı vardır. Türetme ve çok biçimlilik yoktur.

Nesne yönelimli programlama(Object oriented programming) Sınıf tabanlı programlamanın yanında basit kalıtım kavramını içeririr. SmallTalk.

İleri nesne yönelimli programlama(Advanced OOP) C++, Java, C#.

Page 328: C# Akademi 2005

339 (http://www.csharpnedir.com)

Sınıf Kütüphanesi Oluşturmausing System;namespace CSharp{

public class RastgeleSayi{

private Random rnd = new Random();private int mSayi;public int Sayi{

get{return mSayi;}}public RastgeleSayi(){

mSayi = rnd.Next(0,100);}public void Degistir(){

mSayi = rnd.Next(0,100); }

}}

Page 329: C# Akademi 2005

340 (http://www.csharpnedir.com)

Sınıf Kütüphanesi Oluşturmacsc /t:library RastgeleSayi.cs

CSharp.RastgeleSayi r = new CSharp.RastgeleSayi();Console.WriteLine(r.Sayi);r.Degistir();Console.WriteLine(r.Sayi);

csc /r:RastgeleSayi.dll Program.cs

Page 330: C# Akademi 2005

341 (http://www.csharpnedir.com)

Kalıtım (Inheritance) Kalıtım yolu ile nesneler birbirlerinden türetilir. Türeyen sınıflar türediği sınıfın özelliklerini kalıtım yolu

ile devralır.

Page 331: C# Akademi 2005

342 (http://www.csharpnedir.com)

Kalıtım (Inheritance)

Memeli

Kedi

Köpek

Yunus

Temel SınıfBase Class

Türeyen SınıflarDerived Classes

Her sınıf Memeli sınıfından türer ve bu sınıfın ortak özelliklerine sahip olur.

Her sınıfın kendine has özellikleride vardır.

Her sınıf memeli sınıfının özelliklerini ister gizler, ister yeniden kullanır.

Page 332: C# Akademi 2005

343 (http://www.csharpnedir.com)

Kalıtım (Inheritance)using System;class Memeli{

public double Boy;public double Kilo;

public void OzellikGoster(){

Console.WriteLine(“Boy : “+Boy);Console.WriteLine(“Ağırlık : “+Kilo);

}}class Kedi : Memeli{

public string Turu;public void TurGoster(){

Console.WriteLine(“Türü “+Turu);}

}

Temel Sınıf

Türeyen Sınıf

Page 333: C# Akademi 2005

344 (http://www.csharpnedir.com)

Kalıtım (Inheritance)public static void Main(){

Kedi kedi1 = new Kedi();

kedi1. Boy = 5 ;kedi1. Kilo = 10 ;

kedi1. Turu = “VAN”;

kedi1. OzellikGoster() ;

kedi1. TurGoster() ;}

Temel Sınıf Alanları

Türeyen Sınıf Alanı

Temel Sınıf Metodu

Türeyen Sınıf Metodu

Page 334: C# Akademi 2005

345 (http://www.csharpnedir.com)

Kalıtım (Inheritance)

Memeli m=new Memeli();

m.Boy=10;

m.Kilo=5;

m.OzellikGoster();

m.TurGoster();

?

Page 335: C# Akademi 2005

346 (http://www.csharpnedir.com)

Protected Erişimusing System;class Memeli{

private double Boy;private double Kilo;

public void OzellikGoster(){

Console.WriteLine(“Boy : “+Boy);Console.WriteLine(“Ağırlık : “+Kilo);

}}class Kedi : Memeli{

public string Turu;public void BoyGoster(){

Console.WriteLine(“Boy “+ Boy );}

}

Boy alanının değerine erişebilir miyiz?

?

Page 336: C# Akademi 2005

347 (http://www.csharpnedir.com)

Protected Erişimusing System;class Memeli{

protected double Boy;protected double Kilo;

public void OzellikGoster(){

Console.WriteLine(“Boy : “+Boy);Console.WriteLine(“Ağırlık : “+Kilo);

}}class Kedi : Memeli{

public string Turu;public void BoyGoster(){

Console.WriteLine(“Boy “+ Boy );}

}

Diğer sınıfların kullanımına kapalı ancak türemiş sınıflar içinden erişilmesi istenen üyeler protected erişim belirleyicisi ile tanımlanırlar.

Page 337: C# Akademi 2005

348 (http://www.csharpnedir.com)

Protected Erişimclass Uygulama{

static void Main(){

Kedi kedi1=new Kedi();

kedi1.Boy=10;

Memeli m=new Memeli();

m.Boy=8;}

}

Bu kod neden çalışmaz.

?

Page 338: C# Akademi 2005

349 (http://www.csharpnedir.com)

Yapıcıların Rolü Bir Kedi nesnesi tanımlandığında, Kedi sınıfının

yapıcı metodunun çağırılacağı kesindir. Peki Memeli sınıfının yapıcı metodunun akibeti ne olacaktır?

?

Page 339: C# Akademi 2005

350 (http://www.csharpnedir.com)

Yapıcıların Rolüclass Memeli{

public Memeli(){

Console.WriteLine(“Memeli oluşturuldu”);}

}class Kedi : Memeli{

public Kedi(){

Console.WriteLine(“Kedi oluşturuldu”);}

}class Program{

static void Main(){

Kedi kedi1 = new Kedi() ;}

}

ilk olarak Temel Sınıfın yapıcısı çağırılır. Ardından Türeyen sınıfın yapıcısı çağırılır.

Page 340: C# Akademi 2005

351 (http://www.csharpnedir.com)

Yapıcıların Rolü Her yapıcı metodun, kendi tanımlandığı sınıfın üye

elemanları ile ilgili iş yapması, nesne yönelimli programlamanın önemli bir tekniğidir.

Page 341: C# Akademi 2005

352 (http://www.csharpnedir.com)

Yapıcıların Rolü

class Memeli{

public Memeli ( double b , double k ){

Boy=b;Kilo=k;

}}class Kedi : Memeli{ public Kedi(double KediBoy, double KediKilo, string KediTur) : base (KediBoy,KediKilo)

{this.Turu=KediTur;

}}

Page 342: C# Akademi 2005

353 (http://www.csharpnedir.com)

Yapıcıların Rolüclass A{

public A(){

Console.WriteLine(“A sınıfı yapıcısı”);}

}class B : A{

public B(){

Console.WriteLine(“B Sınıfı Yapıcısı”);}

class C : B {

public C(){

Console.WriteLine(“C Sınıfı Yapıcısı);}

}

Bu hiyerarşiye göre C sınıfından bir nesne oluşturulduğunda ekrana ne yazar??

Page 343: C# Akademi 2005

354 (http://www.csharpnedir.com)

Yapıcıların Rolüclass A{

public int a;public A ( int a ){ this.a=a;}

}class B : A{

public int b;public B ( int a , int b ) : base ( a ) ;{

this.b=b;}

class C : B {

public int c;public C ( int a , int b , int c ) : base ( a , b ){

this.c=c;}

}

base anahtar söcüğü sınıf hiyerarşisinin en tepesindeki sınıfı temsil etmez. Bir üstteki sınıfı temsil eder.

Page 344: C# Akademi 2005

355 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding) Bazen türeyen sınıfta, temel sınıftaki bir üye elemanı aynı

isimli bir eleman olarak kullanmak isteyebiliriz. Böyle bir durumda , Temel sınıftaki bu üye elemana

doğrudan erişemeyiz. Çünkü türeyen sınıftaki elemanımız, temel sınıftaki

elemanı gizler. Buna isim gizleme denir.

Page 345: C# Akademi 2005

356 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)class X{

protected int a;

public X(int a){

this.a=a;}public X(){}

public int A{

get{

Console.WriteLine("X Sınıfı");return a;

}}

}

Page 346: C# Akademi 2005

357 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)class Y:X{

protected int b;

public Y(int b){

this.b=b;}public Y(){}public int A{

get{

Console.WriteLine("Y Sınıfı");return b;

}}

}

Page 347: C# Akademi 2005

358 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)public class Program{

static void Main(){

Y y=new Y(5);

int deneme=y.A;}

}

Page 348: C# Akademi 2005

359 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)

İsim saklamayı açıkça belirtmek için new anahtar sözcüğü kullanılır.

class Y:X{

...public new int A{

get{

Console.WriteLine("Y Sınıfı");return b;

}}

}

Page 349: C# Akademi 2005

360 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)İsim gizleme yapıldığı zaman temel sınıftaki elemana ulaşmak için, base anahtar kelimesi kullanılır.

using System;

namespace namehidding{

public class Temel{

public int a;public void Goster(){

Console.WriteLine("Temel.a="+a); }

}}

Page 350: C# Akademi 2005

361 (http://www.csharpnedir.com)

İsim Saklama ( Name Hiding)

public class Tureyen:Temel{

new int a;public Tureyen(int aTemel,int aTureyen){

a=aTureyen;base.a=aTemel;

}new public void Goster(){

base.Goster();Console.WriteLine("Tureyen.a="+a);

}}

Temel sınıfındaki Goster metodunu çağırır.

Temel sınıfındaki a değişkenine değer atar.

İsim gizleme yapıldığı zaman temel sınıftaki elemana ulaşmak için, base anahtar kelimesi kullanılır.

Page 351: C# Akademi 2005

362 (http://www.csharpnedir.com)

Temel ve Türeyen Sınıflar Arası Atama Bir türeyen sınıf nesnesini, türediği Temel sınıf

nesnelerine atayabiliriz. Örneğin,

Page 352: C# Akademi 2005

363 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar Temel sınıflar içinde bildirilmiş ve türeyen sınıflar içinde

tekar bildirilen metodlardır. Temel sınıf referanslarına, türeyen sınıf referansları

aktarıldığında, temel sınıf referansı üzerinden türeyen sınıftaki metodları (override edilmiş metodları ) çağırabiliriz.

Sanal metodlar nesne yönelimli programlama modelinde, çok biçimliliği (polimorphism) desteklerler.

Page 353: C# Akademi 2005

364 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar

public class Memeli{

protected double Boy;protected double Kilo;

public Memeli(double boy,double kilo){

this.Boy=boy;this.Kilo=kilo;

}public virtual void Konus(){

Console.WriteLine("Ben Konuşamam");}

}

Sanal metodlar temel sınıfta virtual anahtar sözcüğü ile tanımlanır.

Page 354: C# Akademi 2005

365 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar

Sana metodlar türeyen sınıfta yeniden bildirilmek için override anahtar sözcüğü ile tanımlanır.

public class Kedi:Memeli{

public string Turu;

public Kedi(double boy,double kilo,string tur):base(boy,kilo){

this.Turu=tur;}

public override void Konus(){

Console.WriteLine("Ben Kediyim");

}}

Page 355: C# Akademi 2005

366 (http://www.csharpnedir.com)

Sanal (Virtual) MetodlarSanal metodlar sayesinde tek bir metod tanımlayıp, programın çalışması sırasında, bu metodun güncel nesneye uygun olan sürümünü kullanabiliriz.

public class Sekil{

public double En;public double Boy;public Sekil(double en,double boy){

this.En=en;this.Boy=boy;

}virtual public double Alan(){

return 0;}

}

Page 356: C# Akademi 2005

367 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar

public class Dortgen:Sekil{

public Dortgen(double boy,double en):base(boy,en){}public override double Alan(){

return En*Boy;}

}

Sanal metodlar sayesinde tek bir metod tanımlayıp, programın çalışması sırasında, bu metodun güncel nesneye uygun olan sürümünü kullanabiliriz.

Page 357: C# Akademi 2005

368 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar

public class Ucgen:Sekil{

public Ucgen(double en,double yukseklik):base(en,yukseklik){}

public override double Alan(){

return (En*Boy)/2;}

}

Sanal metodlar sayesinde tek bir metod tanımlayıp, programın çalışması sırasında, bu metodun güncel nesneye uygun olan sürümünü kullanabiliriz.

Page 358: C# Akademi 2005

369 (http://www.csharpnedir.com)

Sanal (Virtual) MetodlarBir nesnenin bu şekilde çoklu özellik göstermesine çok çeşitlilik (polymorphism) denir.

class Class1{

public static void AlanBul ( Sekil s ){

Console.WriteLine("Alan "+s.Alan());}static void Main(string[] args){

Ucgen u=new Ucgen(4,5); AlanBul(u); Dortgen d=new Dortgen(5,6);AlanBul(d);

}}

Late Binding(Geç Bağlama)

Page 359: C# Akademi 2005

370 (http://www.csharpnedir.com)

Sanal (Virtual) Metodlar Bir metod sanal olarak bildirilmişse, derleyici derleme aşamasında

ürettiği kod ile çalışma zamanında referansın türüne göre ilgili sınıfın devre dışı bırakılmış metodunu çağırır.

Hangi metodun çağırılacağının çalışma zamanında belirlenmesine geç bağlama (late binding) denir.

Virtual metodlar ile override metodların isimlerinin aynı olması gerekir.

Override metodların parametrik yapısı ile virtual metodların parametrik yapısı aynı olmalıdır.

Static metodlar sanal olarak bildirilemez. Türeyen sınıflar, temel sınıflardaki metodları devre dışı bırakmak

zorunda değildir. Bu durumda temel sınıf referansları üzerinden temel sınıfa ait metod çağırılır.

Page 360: C# Akademi 2005

371 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar Özet sınıflar, türeyen sınıflar için bir arayüz sağlarlar.

Türeyen sınıfların hangi üyeleri uygulaması gerektiğini belirler ve buna zorlarlar.

Page 361: C# Akademi 2005

372 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar Özet sınıflar türünden nesneler türetilemez. Özet sınıflar özet metodlar ve özet özellikler dışında

normal metodlar ve özelliklerde içerebilir. Bir özet metod ancak özet bir sınıf içinde tanımlanabilir.

Dolayısıyla özet metodların tanımlanabilmesi için, özet metodu içeren sınıfında özet olması gerekir.

Özet sınıftan türeyen sınıflar, özet sınıflardaki özet metod ve özet özellikleri mutlaka uygulamalıdır.

Bütün özet metodlar içsel olarak virtual olduklarından, ayrıca virtual anahtar kelimesi ile bildirilmezler.

Statik metodlar özet olarak bildirilemez. Özet metodlar private olarak bildirilemez.

Page 362: C# Akademi 2005

373 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar Özet sınıflar türünden nesneler türetilemez.

abstract public class OzetSinif{

}...OzetSinif os=new OzetSinif();

Özet sınıf , metod ve özellikler, abstract anahtar söcüğü ile tanımlanırlar.

Cannot create an instance of the abstract class or interface 'Abstractclas.OzetSinif'

Page 363: C# Akademi 2005

374 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar

Özet Sınıfların yapıcı metodlarını nasıl kullanabiliriz.

?

Page 364: C# Akademi 2005

375 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflarabstract public class Memeli{

public double en;public double boy;

public Memeli(double en,double boy){

this.en=en;this.boy=boy;

}}public class Kedi:Memeli{

public string Turu;public Kedi(double en,double boy,string tur):base(en,boy){

this.Turu=tur;}

}

abstract sınıflardan nesne tanımlayamasakta türeyen sınıf nesneleri üzerinde, abstract sınıfın yapıcılarına ve buradanda üyelerine erişebiliriz.

Page 365: C# Akademi 2005

376 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar Özet sınıftan türeyen sınıflar,

özet sınıflardaki özet metod ve özet özellikleri mutlaka uygulamalıdır.

abstract public class Memeli{...

abstract public void Konus();...}public class Kedi:Memeli{

...public override void Konus(){

Console.WriteLine("Ben bir kediyim...");}

}

özet metodlar herhangibirmetod gövdesi içermez.

özet metodlar türeyen sınıf içinde mutlaka override edilmelidir.

Page 366: C# Akademi 2005

377 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar

Özet özellikler bildirilebilir mi?

?

Page 367: C# Akademi 2005

378 (http://www.csharpnedir.com)

Özet(Abstract) Sınıflar Özet özelliklerde

bildirebiliriz. Bu durumda get ve set bloklarının hangisi yazılmışsa, türeyen sınıfta mutlaka uygulanmalıdır.

class Memeli{

abstract public int A{

get;set;

}}class Kedi:Memeli{

public override int A{

get { return a ; }set { a = value ; }

}}

özet özelliklerin bildirilmesinde get ve set bloklarının gövdesi yazılmaz.

Özet Metodlar neden private olamaz??

Page 368: C# Akademi 2005

379 (http://www.csharpnedir.com)

Örnek

Page 369: C# Akademi 2005

380 (http://www.csharpnedir.com)

Sealed Sınıflar Bir sınıftan türetilme yapılmasını istemiyorsak bu sınıfı

sealed anahtar söcüğü ile birlikte tanımlarız.

sealed class Temel{...}class Tureyen : Temel{...}

Tureyen : cannot inherit from sealed class Temel

Page 370: C# Akademi 2005

381 (http://www.csharpnedir.com)

Arayüzler (Interfaces) Arayüzler, kendisini uygulayan sınıfların

kesin olarak içereceği metod, özellik gibi üyeleri tanımlar.

Arayüzleri genellikle bir kaç firmanın yada programcının çalıştığı projelerde ortak rehber(rehberler) hazırlamak amacıyla kullanırız.

Page 371: C# Akademi 2005

382 (http://www.csharpnedir.com)

Arayüzler (Interfaces)interface IArayuz

{int BirSonraki(int MusteriID);int BirOnceki(int MusteriID);

int ID{

get;set;

}

int this[int indis]{

get;}

}

Arayüz isimlendirmede genellikle arayüz isminin başına I harfi konur.

Metodlar

Özellik

Indeksleyici

Arayüz üyelerimetodlar (methods), özellikler (properties),indeksleyiciler(indexers),temsilciler (delegates),olaylar (events)dır.

Page 372: C# Akademi 2005

383 (http://www.csharpnedir.com)

Arayüzler (Interfaces) Arayüzler yapıcı veya yıkıcı metodlar içeremez. Arayüz elemanları static olarak tanımlanamaz. Arayüz elemanları içsel tasarım olarak public olduklarından,

herhangibir erişim belirleyicisi ile bildirilemezler. Arayüzler herhangibir üye değişken içeremez.

Page 373: C# Akademi 2005

384 (http://www.csharpnedir.com)

Arayüzler (Interfaces)interface IArayuz{

int BirSonraki();int BirOnceki();

int Deger{

get;set;

}

int this[int indis]{

get;}

}

Page 374: C# Akademi 2005

385 (http://www.csharpnedir.com)

Arayüzler (Interfaces)public class Sayilar : IArayuz{

public int BirSonraki(){

return 0;}public int BirOnceki(){

return 0;}public int Deger{

get{return 0;}set{}

}public int this[int indis]{

get{return 0;}}

}

Metodlar uygulanıyor.

Özellik uygulanıyor.

Indeksleyici uygulanıyor.

Page 375: C# Akademi 2005

386 (http://www.csharpnedir.com)

Arayüzler (Interfaces)

Sınıflar arasında çoklu türetme yoktur. Ancak bir sınıfa birden fazla arayüz uygulanarak çoklu kalıtım desteklenebilir.

class Sayilar : IArayuz1 , IArayuz2{...}

Bu sınıf her iki arayüzün üyelerinide uygulamak zorundadır.

Page 376: C# Akademi 2005

387 (http://www.csharpnedir.com)

Arayüzlerde Türetme

Arayüzler birbirlerinden türetilerek daha geniş arayüzlerin oluşturulması sağlanabilir.

interface ITemelArayuz{

void Metod1();}

interface ITureyenArayuz : ITemelArayuz{

void Metod2();}

ITemelArayuz arayüzü uygulanan bir sınıf sadece Metod1 metodunu uygulamılıyken, ITureyenArayuz arayüzünü uygulayan bir sınıf hem Metod1 hemde Metod2 ‘ yi uygulamalıdır.

Page 377: C# Akademi 2005

388 (http://www.csharpnedir.com)

Arayüzlerde Türetme

Arayüzleri birden fazla arayüzden türetebiliriz.

interface ITemelArayuz{

void Metod1();}

interface ITureyenArayuz : ITemelArayuz{

void Metod2();}interface IUcuncuArayuz : ITemelArayuz, ITureyenArayuz{...}

Page 378: C# Akademi 2005

392 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Bütün modern dillerde(C++,JAVA,C#) çalışma zamanında meydana gelebilecek hataları yakalamak için istisnai durum yakalama mekanizması vardır.

Bu mekanizma çalışma zamanında oluşacak hataları sistematik bir şekilde yakalamamızı ve müdahale edilebilmemizi sağlar.

Page 379: C# Akademi 2005

393 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Çalışma zamanında beklenmedik bir hatanın oluşumu sonrasında oluşturulan nesnelere istisnai durum sınıf nesneleri denilmektedir.

Bu sınıflar oluşan hata ile ilgili çeşitli bilgileri tutmak için özelliklere sahipitir.

.NET sınıf kütüphanesinde çok sık oluşabilecek hatalara karşı çeşitli istisnai durum sınıfları tasarlanmıştır.

Object sınıfından türeyen Exception sınıfı istisnai durum sınıf hiyerarşisinin en tepesinde bulunur.

Page 380: C# Akademi 2005

394 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)System.Exception

SystemException ApplicationException

CLR için önceden tanımlanmış istisna sınıfları

Kullanıcı tanımlı istisna sınıfları

ArgumentException

StackOverFlowException

ArithmeticException

IOException FileNotFoundException

IndexOutOfRangeException

NET sınıf kütüphanesinde yüzlerce istisnai durum sınıfı vardır.

Page 381: C# Akademi 2005

395 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Bir hatanın fırlatılması (throwing), çalışma zamanında ilgili hatayı temsil eden sınıf türünden bir nesnenin oluşturulması anlamına gelir.

Page 382: C# Akademi 2005

396 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)try{

//program kodlarında bir hata varsa

}catch(HataSınıfı1 a){

//Hatanın elde edilmesi sonucu çalışan kodlar}finally{

//Kaynakların temizlenmesi}

try bloğundan sonra mutlaka ya catch yada finally bloğunun gelmesi gerekir. Aksi halde derleme hatası alınır.

Page 383: C# Akademi 2005

397 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) try bloğunda programımızın normal kodu bulunmaktadır.

Eğer herhangi bir hata meydana gelmez ise kodlar normal olarak çalıştırılmaya devam eder.

try bloğu bittikten sonrada herhangi bir hata fırlatılmadığı için akış finally bloğuna gelir ve burada ki kodlar çalıştırılır.

Eğer try bloğunda herhangi bir hata ile karşılaşılırsa programın akışı catch bloğuna gelir.

Page 384: C# Akademi 2005

398 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

using System;class Class1{

static void Main(){

int[] a = new int[5];a[10] = 50;

}} Bu koddaki hata nedir?

?

Page 385: C# Akademi 2005

399 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Page 386: C# Akademi 2005

400 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

static void Main(){

int[] a = new int[5];try{

a[10] = 50;}catch{

Console.WriteLine("İstisnai durum oluştu");}finally{

Console.Write("Finally bloğu");}

}

Hatanın oluştuğu yer.

Ekran çıktısı ne olur?

?

Page 387: C# Akademi 2005

401 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

int[] a = new int[5];try{

a[10] = 50;}catch ( IndexOutOfRangeException excp ){

Console.WriteLine("Hata Mesajı : " + excp.Message);}

Uygulama sadece bu hatayı yakaladığında catch bloğuna atlar.

Page 388: C# Akademi 2005

402 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

int a = 10;int b = 0;int c;try{

c = a / b;}catch ( IndexOutOfRangeException excp ){

Console.WriteLine("Hata Mesajı : " + excp.Message);}

Ekran çıktısı ne olur??

Page 389: C# Akademi 2005

403 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

int a = 10;int b = 0;int c;try{

c = a / b;}catch ( DivideByZeroException excp ){

Console.WriteLine("Hata Mesajı : " + excp.Message);}

Sıfıra bölme hatası.

Page 390: C# Akademi 2005

404 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) Bütün istisnai durumları temsil eden sınıflar System isim alanında bulunan

Exception sınıfından türetilmiştir. Exception sınıfında bulunan bütün üye elemanlar kendi oluşturacağımız

sınıflar da dahil bütün sınıflara kalıtım yolu ile geçmiştir.

Message : String türünden olan bu özellik fırlatılan hata ile ilgili açıklayıcı bir mesaj saklar.

Source : Bu özellik catch bloğunda yakalanan istisnai durum nesnesinin gönderildiği uygulamanın yada sınıfın adıdır.

HelpLink : Bu özellikle fırlatılan hata ile ilgili yardım dosyasının yol bilgisi saklanır. Dolayısıyla hata fırlatıldığında istersek catch bloğunda bu özellikten faydalanarak yardım dosyasını açtırabiliriz.

StackTrace : İstisnai durumun fırlatıldığı metot ve program ile ilgili bilgi içerir.

TargetSite : İstisnai durumu fırlatan metot ile ilgili bilgiler veren yansıma konusunda göreceğimiz MethodBase sınıfı türünden bir özelliktir.

InnerException : Bu özellik eğer catch bloğu içerisinden bir hata fırlatılırsa catch bloğuna gelinmesine yol açan istisnai durumun Exception nesnesidir.

Page 391: C# Akademi 2005

405 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)istisnai durumu oluşturacak metodun çağrıldığı yerde catch bloğu kullanılıp hata yakalanabilir.

public static void Main() {

try {

Metot1();}catch(IndexOutOfRangeException excp){

Console.Write(excp.Message);}

}public static void Metot1(){

int[] a = new int[5];a[10] = 5;

}Hata oluşumu.

Güvenli kod bloğuna alınan metod.

Page 392: C# Akademi 2005

406 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Metot1() çağrıldığı anda eğer Metot1() metodunun çalışması sırasında

istisnai bir durum oluşursa önce metodun gövdesinde ilgili hatayı

yakalayacak bir catch bloğunun olup olmadığı kontrol edilir.

Eğer Metot1()’in gövdesinde catch bloğu yoksa, Metot1()’in çağrıldığı

Main() metodu içindeki catch bloğu çalıştırılır.

Page 393: C# Akademi 2005

407 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

int[] dizi = new int[6];Random rnd = new Random();int sayi;for(int i=0; i < 10; ++i){

try{

sayi = rnd.Next(10);dizi[sayi]= i;Console.WriteLine("dizi[{0}]={1}",sayi,i);

}catch(IndexOutOfRangeException){

Console.WriteLine("Dizinin sınırları aşıldı...");}

}

Page 394: C# Akademi 2005

408 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)Bazı durumlarda try bloğu içerisinde throw anahtar sözcüğünü kullanarak kendimiz istisnai durum nesnelerini fırlatmak isteyebiliriz.

throw new IndexOutOfRangeException("Dizinin sınırları aşıldı...");

veya

IndexOutOfRangeException e = new IndexOutOfRangeException("Dizi sınırları aşıldı...");e.HelpLink = "http://www.csharpnedir.com/exception.html";throw e;

throw anahtar sözcüğü try blokları içerisinde kullanılmak zorunda değildir. Ancak try blokları dışında throw ile fırlatılan istisnai durumlar herhangi bir catch bloğu olmadığı için yakalanamaz.

Page 395: C# Akademi 2005

409 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)class Sayilar{

private int mDeger;public Sayilar(int mDeger){

if(mDeger > 100) throw new OverflowException("Deger 100'den büyük olamaz!");else

this.mDeger = mDeger;}public int Deger{

get{return mDeger;}set{ if(value > 100) throw new OverflowException("Deger 100'den büyük

olamaz!");else

this.mDeger = value;}}

}

Page 396: C# Akademi 2005

410 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)class ExceptionTest{

public static void Main() {

try{

Sayilar s = new Sayilar(500);}catch ( OverflowException excp ){

Console.WriteLine(excp.Message);}

}}

throw ile fırlatılan hata yakalanır.

Bizim bildirdiğimiz hata mesajı ekrana yazılır.

Page 397: C# Akademi 2005

411 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)try blokları içerisinde fırlatılan hatalar tek türden olmayabilir. Bir try bloğunda birden fazla istisnai durum oluşma ihtimali varsa her bir istisnai durumu yakalamak için ayrı ayrı catch blokları tanımlanır.

Page 398: C# Akademi 2005

412 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

int i;string str;try{

Console.Write("1-100 arasında sayı girin : ");str = Console.ReadLine();if(i > 100 || i < 1)

throw new OverflowException("Yanlış değer!");i = Int32.Parse(str);

}catch(OverflowException excp){

Console.WriteLine(excp.Message);}catch(FormatException excp){

Console.WriteLine(excp.Message);}

Parse() metodu kendisine parametre olarak gönderilen yazıyı int türne çeviremediği zaman FormatException hatası fırlatır.

Page 399: C# Akademi 2005

413 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) Eğer try bloğundan fırlatılan istisnai durum nesneleri catch bloklarındaki

herhangi bir tür ile uyumlu değilse fırlatılan hata yakalanamayacağı için

program istisnai durum oluştuğunda sonlandırılır.

catch(OverflowException excp){

Console.WriteLine(excp.Message);}catch(IndexOutOfRangeException excp){

Console.WriteLine(excp.Message);}

kullanıcı “56s5A” şeklinde bir yazı girerse Parse() metodu tarafından gönderilen FormatException hatası yakalanamayacaktır.

Page 400: C# Akademi 2005

414 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) try bloğundan gelen istisnai durum sınıfının türü catch bloklarındaki

türlerden birinden türemiş ise yine bu catch bloğu tarafından yakalanabilir.

catch(OverflowException excp){

Console.WriteLine(excp.Message);}catch(Exception excp){

Console.WriteLine(excp.Message);}

try bloğundan fırlatılan istisnai durum sınıf nesnesi OverflowException türünden ise birinci catch bloğu çalıştırılır. Başka bir tür ise ikinci blok çalıştırılır.

Page 401: C# Akademi 2005

415 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) Eğer istisnai durumun türünden bağımsız bir hata yakalama yapmak

istiyorsak catch bloğunu herhangi bir tür belirtmeden de kullanabiliriz.

catch(OverflowException excp){

Console.WriteLine(excp.Message);}catch{

Console.WriteLine(“İstisnai durum oluştu!”);}

Page 402: C# Akademi 2005

416 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) İki catch bloğu arasına herhangi bir kod parçası giremez. Bu derleme

zamanında hataya yol açar .

catch(OverflowException excp){

Console.WriteLine(excp.Message);}int a = 5; catch{

Console.WriteLine(“İstisnai durum oluştu!”);}

Page 403: C# Akademi 2005

417 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

catch{...}catch(Exception excp){...}

Hangi catch bloğu çalıştırılır.

?

Page 404: C# Akademi 2005

418 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) try ve catch blokları, blok faaliyet alanı kapsamına girmektedir.

Dolayısıyla bu bloklarda tanımlanan nesneler blok dışında kullanılamaz.

catch(OverflowException excp){

Console.WriteLine(excp.Message);}catch(Exception excp){

Console.WriteLine(excp.Message);}

Ayrı nesneler olarak algılanır.

Page 405: C# Akademi 2005

419 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) Aynı türden istisnai durum nesneleri alan catch blokları tanımlanamaz.

catch(Exception excp){

Console.WriteLine(excp.Message);}catch(Exception excp){

Console.WriteLine(excp.Message);}

Ayrı türden.

Page 406: C# Akademi 2005

420 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling) İçiçe geçmiş try bloklarını kullanarak bir try bloğundan fırlatılacak hataya

ilişkin catch bloklarının sayısını artırabiliriz.

İçiçe geçmiş try bloklarında da her fırlatılan hata için sadece bir catch

bloğu çalıştırılır fakat bu çalıştırılacak catch bloğu birkaç ihtimal

arasından seçilir.

Page 407: C# Akademi 2005

421 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)try{ //A

try{//B

}catch{

// C İçteki catch bloğu}finally{

// İçteki finally bloğu}

//D}catch{

//Dıştaki catch bloğu}finally{

//Dıştaki finally bloğu}

En dıştaki try bloğunun içinde

fakat içteki try bloğunun dışında

olan A ve D bölgelerinde herhangi

bir istisnai durum meydana gelirse

dıştaki catch ve dıştaki finally

bloğu çalıştırılır.

Page 408: C# Akademi 2005

422 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)try{ //A

try{//B

}catch{

// C İçteki catch bloğu}finally{

// İçteki finally bloğu}

//D}catch{

//Dıştaki catch bloğu}finally{

//Dıştaki finally bloğu}

B’de bir istisnai durum oluşursa

öncelikle içteki catch bloğundan

fırlatılan hataya uygun olanı

çalıştırılır. Sonrada içteki finally

bloğu çalıştırılır.

Eğer B bölgesinden fırlatılan

hatayı yakalayacak uygun bir

catch bloğu bulunamaz ise dıştaki

try bloğuna ait catch blokları

kontrol edilir.

Eğer buradada uygun bir blok

bulunmaz ise yakalanmayan

istisnai durumdan dolayı program

sonlandırılır.

Page 409: C# Akademi 2005

423 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)try{ //A

try{//B

}catch{

// C İçteki catch bloğu}finally{

// İçteki finally bloğu}

//D}catch{

//Dıştaki catch bloğu}finally{

//Dıştaki finally bloğu}

C bölgesinden fırlatılan hataları

yakalayacak catch bloğu en

dıştaki catch blokları arasından

seçilir.

catch blokları içerisinden istisnai

durum sınıf nesnelerini fırlatmak

geçerli olmasına rağmen çok sık

rastlanan bir durum değildir.

Page 410: C# Akademi 2005

424 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Bazı Standart İstisnai Durum Sınıfları

System.OutOfMemoryException Programın çalıştırışması için yeterli bellek miktarı kalmadı ise fırlatılan sınıftır.

System.StackOverflowException

Stack bellek bölgesinin birden fazla metot için kullanılması durumunda fırlatılır. Genellikle öz yinelemeli algoritmalar da bu hata sınıfı fırlatılabilir.

System.NullReferenceException

İçinde null değeri olan(nesne referansı taşımayan) bir nesne referansı üzerinden sınıfın üye elemanlarına erişmeye çalışıldığında fırlatılır.

System.OverflowExceptionAritmetik işlemlerde değişkenlerin değerlerinde taşma olduğu zaman fırlatılır.

System.InvalidCastExceptionÇalışma zamanında geçersiz tür dönüşümü yapıldığında fırlatılır.

Page 411: C# Akademi 2005

425 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Bazı Standart İstisnai Durum Sınıfları

System.IndexOutOfRangeException Bir dizinin indeks sınırları aşıldığında fırlatılır.

System.ArrayTypeMismatchException Bir dizinin herhangi bir elemanına geçersiz bir türden değer atanıldığı zaman fırlatılır.

System.DivideByZeroException Sıfıra bölme yapıldığı zaman fırlatılır.

System.ArithmeticException

DivideByZeroException ve OverflowException sınıflarının temel sınıfıdır. Bu sınıf ile bahsedilen her iki hata durumuda yakalanabilir. Genel olarak aritmetik işlemler sonucunda oluşan istisani durumlarda fırlatılır.

System.FormatExceptionMetotlara yanlış formatta parametre gönderildiğinde fırlatılır. Özellikle string işlemlerinde rastlanılır.

Page 412: C# Akademi 2005

426 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)

Kendi istisnai durum sınıflarımızı ApplicationException sınıfından türeterek oluşturabiliriz.

public class HatalıMetrikİstisnası : ApplicationException{

}

Kullanıcı tanımlı istisna sınıfları

Page 413: C# Akademi 2005

427 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)Kullanıcı tanımlı istisna sınıfları

public class HatalıMetrikİstisnası : ApplicationException{

private int mHataliSantim;private string mHataKaynagi;public HatalıMetrikİstisnası(int mHataliSantim,string mHataKaynagi){

this.mHataKaynagi = mHataKaynagi;this.mHataliSantim = mHataliSantim;

}public int HataliSantim{

get{return mHataliSantim;}}public string HataKaynagi{

get{return mHataKaynagi;}}

Constructor

Properties

Page 414: C# Akademi 2005

428 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)Kullanıcı tanımlı istisna sınıfları

public override string ToString(){

string str1 = "Hata Kaynağı : "+mHataKaynagi+",";string str2 = " Hata degeri : "+mHataliSantim;return str1 + str2;

}}

Exception sınıfından kalıtım olarak alınan ToString metodu override ediliyor.

Page 415: C# Akademi 2005

429 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)Kullanıcı tanımlı istisna sınıfları

public Metrik(int metre,int santim){

if(santim > 99)throw new HatalıMetrikİstisnası(santim,"Yapıcı Metot");

mMetre = metre;mSantim = santim;

}

Bir hata durumunda HataliMetrikİstisnası exception sınıfından bir nesne, ilgili catch bloğuna fırlatılıyor.

Page 416: C# Akademi 2005

430 (http://www.csharpnedir.com)

İstisnai Durum Yönetimi (Exception Handling)Kullanıcı tanımlı istisna sınıfları

Metrik m = new Metrik(10,52);

try{

m.Santim = 650;}catch ( Metrik . HatalıMetrikİstisnası e ){

Console.WriteLine( e . ToString());}

HatalıMetrikİstisnası Exception sınıfındaki ToString metodu çağırılır.

Page 417: C# Akademi 2005

431 (http://www.csharpnedir.com)

Temsilciler (Delegate) Temsilciler metotlara referansta bulunur. Daha alt

seviyede düşünürsek

temsilciler metotların bellekteki adreslerini tutar. Temsilciler, metotları temsil eden bir veri tipidir. Metot isimleri aslında metodun bellekte fiziksel olarak

bulunduğu yerin başlangıç adresini temsil etmektedir.

Page 418: C# Akademi 2005

432 (http://www.csharpnedir.com)

Temsilciler (Delegate)public static int Metot1(){

return 5;}public static void Main() {

Console.WriteLine("Temsilcilere");int a = Metot1();Console.Write(" başlarken...");

}

Bu satıra gelindiğinde bu metodun bellekte bulunduğu adrese gidilir ve ordaki kodlar çalıştırılır.

C# ta metotların bir nevi adreslerini tutan yeni bir veri modeli geliştirilmiştir. İşte bu veri modelini temsil eden tip delegate’ dir.

Page 419: C# Akademi 2005

433 (http://www.csharpnedir.com)

Temsilciler (Delegate)

public delegate void Komutlar(string str);

Temsilciler delegate anahtar sözcüğü ile tanımlanır.

Parametre alabilirler

Erişim belirleyicisine sahip olabilirler.

Page 420: C# Akademi 2005

434 (http://www.csharpnedir.com)

Temsilciler (Delegate)Temsilcilerin kullanılmasının amacı derleme zamanında belli olmayan metot çağrımlarını çalışma zamanında belirlemektir.

public delegate void MetotTemsilcisi();public static void Metot1(){

Console.WriteLine("Ben Metot1'im");}public static void Metot2(){

Console.WriteLine("Ben Metot2'yim");}public static void Main() {

MetotTemsilcisi temsilci = new MetotTemsilcisi(Metot1);temsilci();temsilci = new MetotTemsilcisi(Metot2);temsilci();

}

Temsilci Bildirimi

Temsilci Metod1 için oluşturuluyor.

Page 421: C# Akademi 2005

435 (http://www.csharpnedir.com)

Temsilciler (Delegate)Uygulama

Page 422: C# Akademi 2005

436 (http://www.csharpnedir.com)

Temsilciler (Delegate)Delegate normal bir sınıftır. Dolayısıyla bir metodun parametresi temsilci türünden olabilir.

public delegate void MetotTemsilcisi ( );public static void Metot1(){

Console.WriteLine("Ben Metot1'im");}public static void Metot2(){

Console.WriteLine("Ben Metot2'yim");}public static void Metot3 ( MetotTemsilcisi mt ){

mt();}public static void Main() {

MetotTemsilcisi temsilci = new MetotTemsilcisi(Metot1);Metot3(temsilci);temsilci = new MetotTemsilcisi(Metot2);Metot3(temsilci);

}

Page 423: C# Akademi 2005

437 (http://www.csharpnedir.com)

Çoklu Temsilciler (Multicast Delegates) Bir temsilci ile birden fazla metot temsil edilebilir. Temsilci çağrımı yapıldığında temsilcinin temsil ettiği

bütün metotlar sırayla çalıştırılır. Bu temsil edilen metotların sadece birini yada birkaçınıda

çalıştırabiliriz.

Page 424: C# Akademi 2005

438 (http://www.csharpnedir.com)

Çoklu Temsilciler (Multicast Delegates)

public delegate void MetotTemsilcisi(int a,int b);

public static void Toplama(int a,int b){

Console.WriteLine("{0}+{1} = {2}",a , b ,a + b);}public static void Cikarma(int a,int b){

Console.WriteLine("{0}-{1} = {2}",a , b ,a - b);}public static void Carpma(int a,int b){

Console.WriteLine("{0}*{1} = {2}",a , b ,a * b);}

Page 425: C# Akademi 2005

439 (http://www.csharpnedir.com)

Çoklu Temsilciler (Multicast Delegates)

public static void Main() {

MetotTemsilcisi temsilci = null;

temsilci += new MetotTemsilcisi(Toplama);temsilci += new MetotTemsilcisi(Cikarma);temsilci += new MetotTemsilcisi(Carpma);

temsilci(5,3);Console.WriteLine("***");

temsilci -= new MetotTemsilcisi(Cikarma);

temsilci(6,4);}

Çoklu temsilciye metodlar += operatörü yardımıyla yüklenir.

Çoklu temsilciden metodlar -= operatörü yardımıyla çıkartılır.

Page 426: C# Akademi 2005

440 (http://www.csharpnedir.com)

Çoklu Temsilciler (Multicast Delegates)

Page 427: C# Akademi 2005

441 (http://www.csharpnedir.com)

Delegate ve MultiCast Delegate Sınıfları Tek metodu temsil eden temsilciler System.Delegate

sınıfı nesneleridir. Çoklu temsilciler ise System.MultiCastDelegate sınıfını

temsil etmektedirler. MultiCastDelagate sınıfı Delegate sınıfından türetilmiştir.

Bu yüzden bir takım ortak metotlar ve özellikler içerirler.

Page 428: C# Akademi 2005

442 (http://www.csharpnedir.com)

Delegate ve MultiCast Delegate SınıflarıDelegate sınıfının önemli üye elemanları;

GetInvocationList() Bu metot ile çoklu temsilci yapısında bulunan bütün metotlar System.Delegate türünden bir diziye aktarılır.

DynamicInvoke(object[] parametre_dizisi)

Bir temsilcinin temsil ettiği metodu çağırmak için kullanılır.

Combine(Delegate[] temsilciler)

Statik metot olan Combine çoklu bir temsilciye temsilciler ile belirtilen Delegate dizisindeki metotları ekler.

Combine(Delegate temsilci1, Delegate temsilci2):

temsilci1 ve temsilci2 isimli temsilcilerin bütün metotlarını arka arkaya ekler.

Page 429: C# Akademi 2005

443 (http://www.csharpnedir.com)

Delegate ve MultiCast Delegate Sınıfları

MetotTemsilcisi temsilci = null;

temsilci += new MetotTemsilcisi(Toplama);temsilci += new MetotTemsilcisi(Cikarma);temsilci += new MetotTemsilcisi(Carpma);

Delegate[ ] t = temsilci.GetInvocationList();

object [] parametreler = {5,6};

t[0].DynamicInvoke(parametreler);t[1].DynamicInvoke(parametreler);t[2].DynamicInvoke(parametreler);

Çoklu temsilcinin içerdiği temsilcilerin listesi Delegate tipinden bir diziye alınıyor.

2 indisli temsilcinin işaret ettiği metod, parametreler olarak aldığı değerler ile birlikte çalıştırılıyor.

Page 430: C# Akademi 2005

444 (http://www.csharpnedir.com)

Olaylar (Events) Olaylar, temsilcilerin özel bir halidir. Örneğin,

bir windows uygulamasında bir butona tıkladığımızda kendi yazdığımız bir bölüm kodun çalışması olay mantığı ile gerçekleşmektedir. Burada ki olay butonun tıklanmasıdır. Butona tıklanınca butonun tıklanması ile ilişkin yazdığımız metot çalıştırılır.Bu metodu çağıran ise olay yöneticisi dediğimiz temsilcilerdir.

Page 431: C# Akademi 2005

445 (http://www.csharpnedir.com)

Olaylar (Events)using System;

delegate void OlayYoneticisi();

class Buton{

public event OlayYoneticisi ButonKlik;public void Kliklendi(){

if (ButonKlik != null) ButonKlik();

}}

Olay yöneticisi olarak bir temsilci bildirimi yapılıyor.

Olayın bildirimi

Olayı meydana getirecek metot

Temsilci Olayın Adı

Page 432: C# Akademi 2005

446 (http://www.csharpnedir.com)

Olaylar (Events)public class OlayTest{

static void Main(){

Buton buton = new Buton();

buton.ButonKlik += new OlayYoneticisi(ButonKlik);

buton.Kliklendi();}public static void ButonKlik(){

Console.WriteLine("Buton kliklendi!");}

}

Olayın meydana getirilmesi

Olay sonrası işletilecek metot(Event Handler)

Olay sonrası işletilecek metodların eklenmesi.

Page 433: C# Akademi 2005

447 (http://www.csharpnedir.com)

Olaylar (Events) Olayın başlatılması ve olay oluştuktan sonra çalıştırılacak

metot(event handler) bizim tarafımızdan yapılmıştır. Özellikle windows programlamada olayın oluşturulması ile biz

çok fazla ilgilenmeyiz. Olaylar işletim sistemi tarafından bizim programa gönderilir.

Bizim yapmamız gereken belirlenen bu olaylar gerçekleştiğinde çalışacak kodları belirlemektir.

Page 434: C# Akademi 2005

448 (http://www.csharpnedir.com)

Olaylar (Events) event nesnesine += operatörü ile yeni metotlar ekleyerek olaydan sonra

birden fazla metodun çalıştırılmasını sağlayabiliriz.

static void Main(){

Buton buton = new Buton();buton.ButonKlik += new OlayYoneticisi(ButonKlik1);buton.ButonKlik += new OlayYoneticisi(ButonKlik2);

buton.Kliklendi();}public static void ButonKlik1(){

Console.WriteLine("Buton kliklendi!(1)");}public static void ButonKlik2(){

Console.WriteLine("Buton kliklendi!(2)");}

EventHandlers

Page 435: C# Akademi 2005

449 (http://www.csharpnedir.com)

Olaylar (Events) Olayları işletecek metotların statik metot olma zorunluluğu yoktur. Olay

nesnesine herhangi bir nesne üzerinden diğer sınıfların normal metotlarıda eklenebilir.

Page 436: C# Akademi 2005

450 (http://www.csharpnedir.com)

Olaylar (Events) Bazen olay yöneticisine eklenecek metotlar ile ilgili

kısatlamalarımız olabilir. Örneğin bir olay için sadece belirli sayıda metotun çalıştırılmasını isteyebiliriz. Bu durumda olay yöneticisine eklenen metotların kontrolünü yapmamız gerekir.

Olay yöneticisine += operatörü ile metot eklendiğinde add bloğu -= operatörü ile metot çıkarıldığı zaman remove bloğu çalıştırılır.

Page 437: C# Akademi 2005

451 (http://www.csharpnedir.com)

Olaylar (Events)public event OlayYoneticisi ButonKlik{

add{

int i;for(i=0; i<2; ++i)

if(olay[i] == null){

olay[i] = value;break;

}if(i==2)

Console.WriteLine("Olay yöneticisine en fazla 2 metot eklenebilir.");

}

Olay eklendiğinde çalıştırılacak kod bloğu

Eklenen olayı temsil eder.

Page 438: C# Akademi 2005

452 (http://www.csharpnedir.com)

Olaylar (Events)

remove{

int i;for(i=0; i<2; ++i)

if(olay[i] == value){

olay[i] = null;break;

}if(i==2)

Console.WriteLine("Metot bulunamadı!");}

}

Olay çıkartıldığında çalıştırılacak kod bloğu

Çıkartılan olayı temsil eder.

Page 439: C# Akademi 2005

453 (http://www.csharpnedir.com)

Olaylar (Events) .NET sınıf kütüphanesinde özellikle windows programlamaya

ilişkin isim alanlarında bir çok olay tanımlanmıştır.

void EventHandler ( object kaynak , EventArgs e )

olayı elde eden nesneyi temsil eder.

olayın meydana getirildiği yerden olayı işleyen metoda ekstra bilgi göndermek için kullanılır.

Page 440: C# Akademi 2005

454 (http://www.csharpnedir.com)

Olaylar (Events) .NET uyumlu olaylar için önceden tanımlanmış EventHandler

temsilcisi bulunmaktadır. .NET uyumlu olaylar geliştiriyorsak ekstra bir temsilci

bildirmemeize gerek yoktur.

Page 441: C# Akademi 2005

455 (http://www.csharpnedir.com)

Olaylar (Events)

using System;class Buton{

public event EventHandler ButonKlik;

public void Kliklendi(){

if (ButonKlik != null) ButonKlik(this, new EventArgs());

}}

Bizim tarafımızdan tanımlanmış herhangi bir temsilci yoktur.

Page 442: C# Akademi 2005

456 (http://www.csharpnedir.com)

Olaylar (Events)public class OlayTest{

static void Main(){

Buton buton = new Buton();buton.ButonKlik += new EventHandler(ButonKlik);

buton.Kliklendi();}public static void ButonKlik(object kaynak, EventArgs e){

Console.WriteLine("Buton kliklendi!");Console.WriteLine("Olayın kaynağı : {0}",kaynak);

}}

Page 443: C# Akademi 2005

457 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly Sınıfı Kaynak kodumuzun ve metadata bilgilerinin bulunduğu .NET

birimine assembly denilmektedir. Assembly sınıfı yardımı ile çalışma zamanında metadata

dediğimiz verilere erişmemiz mümkündür. Bu metadata veriler programdaki üye elemanların çeşitli

özellikleridir, örneğin bir metodun parametreleri, bir sınıfın üye değişkenleri gibi.

Page 444: C# Akademi 2005

458 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly Sınıfı Çalışan programımız içinde bir assembly olabileceği gibi

birden fazla assembly de içerebilir. Programımıza ilişkin bütün assembly’leri elde etmek için AppDomain sınıfını kullanıyoruz.

AppDomain sınıfının statik CurrentDomain özelliği ile o an üzerinde çalışılan AppDomain nesnesi elde edilir.

AppDomain bir uygulama için konteyner gibi çalışır. Assembly’ler bu AppDomain’ler içine yüklenir. Bu yüzden bir AppDomain içerisinde birden fazla Assembly olabilir.

Her bir assembly’yi temsil etmek için System.Reflection isim alanında Assembly sınıfı mevcuttur.

Page 445: C# Akademi 2005

459 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly SınıfıAppDomain sınıfının GetAssemblies() statik metodu ile programa ilişkin bütün assembly’ler bir Assembly türden diziye aktarılır.

using System;using System.Reflection;class YansimaVeAssembly{static void Main(){

AppDomain ad = AppDomain.CurrentDomain;Assembly[] assembly = ad.GetAssemblies();Console.WriteLine("Toplam Assembly sayisi : " + assembly.Length);for(int i=0; i<assembly.Length; ++i)

Console.WriteLine("Assembly yeri: " + assembly[i].Location );}}

Güncel application domain nesnesi elde edilir.

Domain içindeki assembly’lar alınıyor

Döngü assembly sayısı kadar çalışır.

Page 446: C# Akademi 2005

460 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly SınıfıAssembly sınıfının GetExecutingAssembly() statik metodu ile o an çalışan programımıza ilişkin olan Assembly geri döndürülür.

static void Main(){ Assembly asmb = Assembly.GetExecutingAssembly();

Console.WriteLine("Assembly'nin başlangıç noktası :" +  asmb.EntryPoint);}

assembly dosyasına ilişkin başlama noktasını verir. Çalıştırılabilir dosyalarda bu genellikle Main() metodudur. Dll şeklindeki Assembly’lerde ise giriş noktası yoktur. (null)

Page 447: C# Akademi 2005

461 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly SınıfıAssembly sınıfının LoadFrom(string assembly_yolu) metodu ile bir Assembly dosyasının yolu belirtilerekte Assembly sınıfı nesneleri elde edilebilir.

static void Main(){

string Yol = @"d:\winnt\microsoft.net\framework\v1.0.3705\mscorlib.dll";

Assembly asmb = Assembly.LoadFrom(Yol);

Console.WriteLine("Assembly'nin başlangıç noktası :" +asmb.EntryPoint);}

Page 448: C# Akademi 2005

462 (http://www.csharpnedir.com)

Assembly Kavramı ve Assembly SınıfıAssembly sınıfının en önemli metodu GetTypes() isimli metodudur. Bu metot ile bir assembly de bulunan bütün türler Type türünden bir diziye aktarılır.

AppDomain ad = AppDomain.CurrentDomain;

Assembly[] assembly = ad.GetAssemblies();

for(int i=0; i < assembly.Length ; ++i ){

Console.WriteLine("Assembly: "   + assembly[i].Location );

Console.WriteLine("Tür sayısı: " + assembly[i].GetTypes().Length);

Console.WriteLine();}

Page 449: C# Akademi 2005

463 (http://www.csharpnedir.com)

Type Sınıfı ve Yansıma

Type sınıfı yansıma(reflection) kavramının en temel yapıtaşıdır.

Type sınıfı bir assembly’deki tür bilgisine ilişkin bilgileri içerir.

Type sınıfı özet(abstract) sınıftır. Type türünden nesneler elde etmek için genellikle typeof

opereratörü ve Object sınıfının GetType() metodu kullanılır. Type türünden nesneleri kullanarak bir tür ile ilgili çeşitli

bilgiler elde ederiz.

?

Page 450: C# Akademi 2005

464 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaSystem.Reflection isim alanında her bir eleman tipine ilişkin bilgileri temsil etmek için birçok sınıf mevcuttur.

MemberInfo sınıfı

Bir türdeki bütün elemanları temsil etmek için kullanılır.

Page 451: C# Akademi 2005

465 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaMemberInfo sınıfı

Bir türdeki bütün elemanları temsil etmek için kullanılır.

Type t = typeof(String);

MemberInfo[] elemanlar = t.GetMembers();

foreach(MemberInfo mi in elemanlar)

{

if(mi.MemberType == MemberTypes.Method)

Console.WriteLine(mi.Name);

}

String sınıfının tipi Type nesnesine alınıyor.

t tipindeki üyelerin listesi alınıyor.

Üye metod ise.

Metodun adı alınıyor.

Page 452: C# Akademi 2005

466 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaMethodInfo sınıfı

Bir türdeki metotları temsil etmek için kullanılır.

Type t = typeof(Array);MethodInfo[] metotlar = t.GetMethods();int ToplamMetot = 0;foreach(MethodInfo mi in metotlar){

Console.WriteLine(mi.Name);Console.WriteLine(mi.ReturnType);if(mi.IsStatic)

Console.WriteLine("Statik(Static)");else

Console.WriteLine("Örnek(Instance)");Console.WriteLine();ToplamMetot++;

}

t tipinin metodları alınıyor.

Metodun adı

Metodun dönüş türü

Metod static mi?

Page 453: C# Akademi 2005

467 (http://www.csharpnedir.com)

Type Sınıfı ve Yansımamscorlib.dll assembly’indeki her bir tipteki toplam metot sayısı ekrana yazdıran program?

Page 454: C# Akademi 2005

468 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaParameterInfo sınıfı

Bir metottaki parametreler ParameterInfo sınıfı ile temsil edilir.

Type t = typeof(Deneme);

MethodInfo[ ] metotlar = t.GetMethods();

Console.WriteLine(t.Name + " türünün metotları\n");

foreach(MethodInfo metot in metotlar)

{

Console.Write(metot.ReturnType.Name + " " + metot.Name + "(");

ParameterInfo[] p = metot.GetParameters();

for(int i=0 ; i < p.Length; ++i)

Console.Write(p[i].ParameterType.Name + " " + p[i].Name

+(i+1 < p.Length ? ", " : ""));

Console.WriteLine(")\n");

}

Page 455: C# Akademi 2005

469 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaConstructorInfo sınıfı

Bir türün yapıcı metotları hakkında bilgi verir.

Type t = typeof(String);

ConstructorInfo[] yapicilar = t.GetConstructors();

Console.WriteLine(t.Name + " türünün metotları\n");

foreach( ConstructorInfo yapici in yapicilar )

{

Console.Write(t.Name + "(");

ParameterInfo[] p = yapici.GetParameters();

for(int i=0 ; i < p.Length; ++i)

Console.Write(p[i].ParameterType.Name + " " + p[i].Name

+ (i+1 < p.Length ? ", " : ""));

Console.WriteLine(")\n");

}

Yapıcı metodun parametreleri alınıyor.

t tipinin yapıcıları alınıyor.

Page 456: C# Akademi 2005

470 (http://www.csharpnedir.com)

Type Sınıfı ve YansımaPropertyInfo, FieldInfo ve EventInfo sınıfları

sınıflar sırası ile bir türdeki özellikleri, değişkenleri ve olayları temsil etmek için kullanılır.

Type t = typeof ( System.Windows.Forms.Button ) ;

EventInfo[] olaylar = t.GetEvents();

Console.WriteLine(t.Name + " türünün olayları\n");

foreach(EventInfo olay in olaylar)

{

Console.Write("Olay Adı: " + olay.Name);

Console.WriteLine("("+(olay.IsMulticast ?  "MultiCast" : "") + ")");

Console.WriteLine("Olay Yöneticisi türü: " + olay.EventHandlerType);

Console.WriteLine();

}

Olaylar alınıyor.

Olay temsilcisi MultiCast mi?

?

Page 457: C# Akademi 2005

471 (http://www.csharpnedir.com)

Nitelikler Nitelikler bir metot yada diğer üye elemanlarla

ilgili ekstra bilgiler vermek amacıyla bu elemanların bildiriminden önce yazılan bilgilerdir.

[Nitelik(Argümanlar)]public void Metot(int a){}

Page 458: C# Akademi 2005

472 (http://www.csharpnedir.com)

Nitelikler Conditional Niteliği : Bu nitelik ile metotların koşullu

olarak çağrılıp çağrılmaması sağlanır. Metodun çağrılmasındaki kriter nitelik parantezinde

belirtilen sembolün #define önişlemci komutu ile tanımlanıp tanımlanmamasıdır.

Bu nitelik System.Diagnostic isim alanında bulunur. Özelliklere ve üye değişkenlere uygulanamaz sadece

metotlara uygulanabilir.

Page 459: C# Akademi 2005

473 (http://www.csharpnedir.com)

Nitelikler#define TURKCEusing System;using System.Diagnostics;class Deneme{

[Conditional("TURKCE")]public void Turkce(){

Console.WriteLine("Merhaba!");}[Conditional("ENGLISH")]public void English(){

Console.WriteLine("Hello!");}

}

Page 460: C# Akademi 2005

474 (http://www.csharpnedir.com)

Niteliklerclass Nitelikler{

static void Main(){

Deneme den = new Deneme();den.English();den.Turkce();

}}

Page 461: C# Akademi 2005

475 (http://www.csharpnedir.com)

Nitelikler DllImport Niteliği : Bu nitelik ile bir metodun .NET ortamında

geliştirilmediği belirtilmektedir. Özellikle Windows API’fonksiyonlarını kullanmak için DllImport

niteliği kullanılır. Bu nitelik System.Runtime.InteropServices isim alanında bulunur.

Fonksiyonun harici bir kaynakta olduğunu bildirmek için ise extern anahtar sözcüğü kullanılmalıdır.

[DllImport("User32.dll")]

public static extern int MessageBox(int aile,string mesaj,string baslik,int tip);

static void Main(){

MessageBox(0,"Bu bir mesajdır","C#",1);}

Page 462: C# Akademi 2005

476 (http://www.csharpnedir.com)

Nitelikler Obsolete Niteliği : Bu nitelik ile bir metodun çağrılması durumunda

hata yada uyarı verilmesi sağlanır.

[Obsolete("Uyarı: Bu metot eski versiyondur.")]public static void Metot1(){

Console.WriteLine("Uyarı veren metot");}[Obsolete("Hata: Bu metot artık kullanılamaz",true)]public static void Metot2(){

Console.WriteLine("Uyarı veren metot");}static void Main(){

Metot1();Metot2();

}

Derleyici Uyarı verecektir.

Derleyici hata verecektir.

Page 463: C# Akademi 2005

477 (http://www.csharpnedir.com)

Nitelikler AttributeUsage Niteliği : Bu nitelik ile kullanıcı tanımlı

nitelik sınıflarının hangi elemanlar için kullanılabileceği belirtilir.

Parametre olarak AttributeTargets isimli bir numaralandırma almaktadır. Bu numaralandırma ile programcının tanımladığı niteliklerin hangi elemanlara uygulanabileceği belirtilir.

Page 464: C# Akademi 2005

478 (http://www.csharpnedir.com)

NiteliklerAttributeTargets numaralandırmasında bulunan semboller

All, Assembly, Class, Constructor, Delegate, Enum, Event, Field,Interface, Method, Module, Parameter, Property, ReturnValue, Struct

Page 465: C# Akademi 2005

479 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

C#’ taki niteliklerin tamamı aslında System.Attribute sınıfını temsil etmektedir.

Attribute sınıfından kalıtım yolu ile kendi niteliklerimizi oluşturabiliriz.

Niteliklerin oluşturulması normal bir sınıf bildiriminden farksızdır.

Page 466: C# Akademi 2005

480 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

using System;[AttributeUsage(AttributeTargets.Method)]class OzelNitelik : Attribute{

private string mMesaj;

public OzelNitelik(string mesaj){

mMesaj = mesaj;}public string Mesaj{

get{

return mMesaj;}

}}

OzelNitelik adlı bir nitelik sınıfı bildirilip ardından bir metot bu nitelik ile işaretleniyor.

OzelNitelik niteliğinin yalnızca metotlara uygulanabileceği belirtiliyor.

Page 467: C# Akademi 2005

481 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

class Nitelikler{

[OzelNitelik("Ozel nitelikli metot")]public static void Metot2(){

Console.WriteLine("Metot2");}static void Main(){}

}

Page 468: C# Akademi 2005

482 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

Niteliklerde isimli paramterelerin de tanımlanabilir.

[OzelNitelik("Nitelikli sınıf",konu= ”C#”, no=5.6)]

Bu isimli parametreler bir nitelik sınıfındaki public üye değişkenleri temsil etmektedir.

Page 469: C# Akademi 2005

483 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

[AttributeUsage(AttributeTargets.Method)]class OzelNitelik : Attribute{

private string mMesaj;public int No;public string Konu;

public OzelNitelik(string mesaj){

mMesaj = mesaj;}public string Mesaj{

get{

return mMesaj;}

}}

Page 470: C# Akademi 2005

484 (http://www.csharpnedir.com)

Özel Nitelik Bildirimi ve Niteliklerin Elde Edilmesi

class Nitelikler{

[OzelNitelik("Ozel nitelikli metot",No=5,Konu="C#")]public static void Metot2(){

Console.WriteLine("Uyarı veren metot");}static void Main(){}

}

[OzelNitelik("Ozel nitelikli metot",No=5,Konu="C#")][OzelNitelik("Ozel nitelikli metot",No=5)][OzelNitelik("Ozel nitelikli metot", Konu="C#")][OzelNitelik("Ozel nitelikli metot")]

Page 471: C# Akademi 2005

485 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

.NET platformunda bellek yönetimi gereksiz bilgi toplayıcısı dediğimiz mekanizma ile otomatik olarak sağlanıyorsada bazen belleğe direkt erişmemiz gerekebilir. Bu durumda gösterici kullanmamız gerekir.

Göstericiler nesnelerin bellekte bulunan adreslerini tutan veri yapılarıdır.

Page 472: C# Akademi 2005

486 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

istisnai durumlar dışında göstericilere ihtiyacımız olmaz, bu istisna durumlar;

Performans

Geriye Uyumluluk

Alt Seviye İşlemler

Hata ayıklayıcı programlar

Page 473: C# Akademi 2005

487 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

C#'ta gösterici kullanacağımız zaman kod bloklarını unsafe(emniyetsiz) anahtar sözcüğü ile işaretlememiz gerekir.

Page 474: C# Akademi 2005

488 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

unsafe olarak işaretlenen sınıfların bütün metotlarında gösterici kullanabiliriz.

unsafe class Sınıf{

}

Page 475: C# Akademi 2005

489 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Normal bir metot içinde herhangi bir bloğu unsafe olarak aşağıdaki gibi işaretleyip dilediğimiz gibi gösterici kullanabiliriz. unsafe bloklarının dışında ise gösterici kullanamayız.

int NormalMetot(int a, string str){    unsafe    {

    }}

Page 476: C# Akademi 2005

490 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Normal bir metodu unsafe olarak işaretleyip sadece o metodun içinde de gösterici kullanabiliriz.

unsafe int NormalMetot(int a, string str){

}

Page 477: C# Akademi 2005

491 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Bir sınıfın üye değişkenlerinden biri unsafe olarak işaretlenip gösterici olarak bildirilebilir. Ancak bir metot içerisinde yerel bir gösterici tanımlanamaz. Yerel bir gösterici tanımlamak için unsafe olarak işaretlenmiş metod yada blok kullanılır.

class Sınıf{     unsafe char *ptr;}

Page 478: C# Akademi 2005

492 (http://www.csharpnedir.com)

Gösterici Bildirimi ve Gösterici Operatörleri C#’ ta göstericiler ayrı bir veri türüdür. Bu veri türü ile

nesnelerin bellekteki adresleri tutulur.

char * ptr1; int* ptr2;int* ptr1,ptr2;double* ptr = (double*)123874;

Gösterici tanımlaması C ve C++ dillerinde olduğu gibi tanımlanan gösterici türünün yanına * karakteri eklenerek yapılır.

Page 479: C# Akademi 2005

493 (http://www.csharpnedir.com)

Gösterici Bildirimi ve Gösterici Operatörleri & operatörü : Adres operatörü olarak bilinen bu operatör

değişkenlerin veya nesnelerin bellekte bulundukları adresleri elde etmek için kullanılır.

int a = 5;int* ptr1;

ptr1 = & a

int türden bir göstericiye daha önceden tanımlanan int türden bir nesnenenin bellekteki adresi atanmaktadır.

Page 480: C# Akademi 2005

494 (http://www.csharpnedir.com)

Gösterici Bildirimi ve Gösterici Operatörleri * operatörü İçerik operatörü olan *, bir adresteki bilgileri elde

etmek için yada o adresteki bilgiyi değiştirmek için kullanılır.

double a = 5;double * ptr1;

ptr1 = &a;*ptr1 = 10;

a nesnesinin adresi double türden bir göstericiye atandıktan sonra içerik operatörü kullanılarak bu adresteki değer 10 olarak değiştiriliyor.

Page 481: C# Akademi 2005

495 (http://www.csharpnedir.com)

Gösterici Bildirimi ve Gösterici Operatörleri

unsafe{

double a = 5;double* ptr1;

ptr1 = &a;*ptr1 = 10;Console.WriteLine(a);char c = 'A';char* ptr2;

ptr2 = &c;*ptr2 = 'S';Console.WriteLine(c);

}

programı derleyebilmek için komut satırı derleyicisene programın içinde unsafe bloğunun olduğunu belirtmemiz gerekir.

csc /unsafe KaynakKod.cs

veya

csc -unsafe KaynakKod.cs

Page 482: C# Akademi 2005

496 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

int* ptr1;*ptr1 = 50;

Bu deyimleri içeren bir program derlenemeyecektir. Çünkü ptr1 göstericisinde hangi adresin tutulduğu belli değildir. Bu yüzden adresi belli olmayan bellek bölgesine bir değer yerleştirmek imkansızdır.

Page 483: C# Akademi 2005

497 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

İlk değer verilmeyen bir göstericiye içerik operatörü ile erişilemez.

using System;class Gosterici{

static void Main(){

unsafe{

int* ptr1;*ptr1 = 50;

}}

} Use of unassigned local variable 'ptr1

Page 484: C# Akademi 2005

498 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Göstericiler arasında diğer türlerde olduğu gibi dönüşümler yapılabilir.

char c = 'A';int i = 10;char* ptr1 = &c;int* ptr2 = &i;ptr1 = (char*)ptr2;

Page 485: C# Akademi 2005

499 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Göstericiler arasındaki tür dönüşümü açıkca belirtilmelidir.

char c = 'A';int i = 10;char* ptr1 = &c;int* ptr2 = &i;ptr2 = ptr1;

Page 486: C# Akademi 2005

500 (http://www.csharpnedir.com)

C#’ta Gösterici(Pointer) Kullanımı ve Eminiyetsiz(unsafe) Kod

Göstericiler arasında yapılan tür dönüşümünde göstericinin sayısal değeri değişmez. Değişen şey göstericinin tür bileşenidir. Bütün göstericilerin 4 byte büyüklüğünde olduğunu düşünürsek dönüşüm sonrasında göstericideki sayısal değerin değişmesi olanaksızdır.

unsafe{

char c = 'A';int a = 10;char* ptr1 = &c;int* ptr2 = &a;

uint cAdres = (uint)ptr1;long aAdres = (long)ptr2;Console.WriteLine("c'nin adresi : {0:X}",cAdres);Console.WriteLine("a'nın adresi : {0:X}",aAdres);

}

Page 487: C# Akademi 2005

501 (http://www.csharpnedir.com)

Gösterici Artimetiği ve Dizi İşlemleri Göstericilerin adres bileşenlerine sabit tamsayı değerleri ekleyebiliriz,

aynı şekilde göstericilerin adres bileşeninden sabit bir tamsayı değerini çıkarabiliriz.

Bir göstericinin değerini bir artırmak göstericinin adres bileşenini, göstericinin türünün içerdiği byte sayısı kadar artırmak demektir. Aynı kural çıkarma işlemi içinde geçerlidir.

Page 488: C# Akademi 2005

502 (http://www.csharpnedir.com)

Gösterici Artimetiği ve Dizi İşlemleri

unsafe static void Main(){

int* ptr1 = (int*)500;char* ptr2 = (char*)500;double* ptr3 = (double*)500;byte* ptr4 = (byte*)500;ptr1 += 2;ptr2 += 5;ptr3 += 2;ptr4 += 6;Console.WriteLine((uint)ptr1);Console.WriteLine((uint)ptr2);Console.WriteLine((uint)ptr3);Console.WriteLine((uint)ptr4);

}

int türden bir göstericiye 2 sayısını eklemek göstericinin adres bileşenini 2*4=8 kadar artırmıştır. Aynı şekilde char türden bir göstericiye 5 değerini eklemek göstericinin adres bileşenini 5*2 =10 kadar artırmıştır.

Göstericiler üzerinde sadece tamsayılarla aritmetik işlemler yapılabilir.

Page 489: C# Akademi 2005

503 (http://www.csharpnedir.com)

Gösterici Artimetiği ve Dizi İşlemleri Gösterici türleri aynı olmak şartıyla iki göstericiyi birbirinden

çıkarabiliriz. İki gösterici arasındaki fark, adres bileşenlerinin sayısal

farkının gösterici türlerinin büyüklüğünden kaç adet byte miktarı edeceğidir. Diğer bir deyişle adres bileşenlerinin sayısal farkı alınıp gösterici türünün byte miktarına göre bir değer belirlenir.

İki göstericinin farkı long türden bir değer üretir.

int türden 5008 adres ile int türden 5000 adresinin farkı

(5008-5000) % sizeof(int) tir.

Yani sonuç long türden 2 dir.

Page 490: C# Akademi 2005

504 (http://www.csharpnedir.com)

Gösterici Artimetiği ve Dizi İşlemleri

unsafe static void Main(){

int* ptr1 = (int*)500;int* ptr2 = (int*)508;

long fark=ptr2 - ptr1;Console.WriteLine(fark);

}

Page 491: C# Akademi 2005

505 (http://www.csharpnedir.com)

fixed Anahtar Sözcüğü Bir değişkenin adresinin belirlenen bir faaliyet alanı boyuncu

değişmeden kalması için bunu gereksiz nesne toplayıcısına bildirmemiz gerekir. Bunun için fixed anahtar sözcüğü kullanılır.

fixed anahtar sözcüğünü kullanmadan referans türünden nesnelerin üye elemanlarının adreslerini elde etmemiz mümkün değildir. Üye elemanlarının adreslerini elde edemediğimiz bu tür nesnelere managed type(yönetilen tip) denilmektedir.

Page 492: C# Akademi 2005

506 (http://www.csharpnedir.com)

fixed Anahtar Sözcüğüclass ManagedType{

public int x;public ManagedType(int x){

this.x = x;}

}class Gosterici{

unsafe static void Main(){

ManagedType mt = new ManagedType(5);

int* ptr1 = &(mt.x);}

}

ManagedType isimli sınıfın int türden olan x elemanının adresi bir göstericiye atanmak isteniyor.

x elemanı değer tipi olmasına rağmen mt nesnesi üzerinden x değişkeninin adresi elde edilememektedir. Çünkü x değişkeninin adresi gereksiz nesne toplayıcısı tarafından her an değiştirilebilir.

Page 493: C# Akademi 2005

507 (http://www.csharpnedir.com)

fixed Anahtar Sözcüğüusing System;class ManagedType{

public int x;public ManagedType(int x){

this.x = x;}

}class Gosterici{

unsafe static void Main(){

ManagedType mt = new ManagedType(5);

fixed(int* ptr1 = &(mt.x)){

//x'in adresi bu blokta asla değişmez.}

}}

fixed ile işaretlenmiş blokta x’in adresinin değişmeyeceği garanti altına alınmıştır.

Page 494: C# Akademi 2005

508 (http://www.csharpnedir.com)

fixed Anahtar Sözcüğü

ManagedType mt1 = new ManagedType(5);ManagedType mt2 = new ManagedType(5);fixed(int* ptr1 = &(mt1.x))fixed(int* ptr1 = &(mt2.x)){

//x'in adresi bu blokta asla değişmez.}

Birden fazla değişkeni fixed olarak işaretlemek için

Page 495: C# Akademi 2005

509 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri Bütün diziler managed type kapsamına girerler. Bu yüzden

tanımladığımız bir dizinin herhangi bir elemanının adresini fixed bloğu kullanmadan bir göstericiye atayamayız.

Göstericiler ile dizi işlemleri yaparken ya fixed blokları kullanıp gereksiz nesne toplayıcısını uyarmalıyız yada stackalloc anahtar sözcüğünü kullanarak kendimiz unmanaged type(yönetilemeyen tip) dizileri oluşturmalıyız.

Page 496: C# Akademi 2005

510 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri Bir dizinin elemanlarını elde etmek için dizinin ilk elemanının

adresini ve dizinin boyutunu bilmemiz yeterlidir.

unsafe static void Main(){

int[] a = {1,2,3,4} ;

fixed(int* ptr = &a[0]){

for(int i=0; i<a.Length; ++i)Console.WriteLine(*(ptr+i));

}

}

dizinin ilk elemanın adresinin elde ediliyor.

Döngü değişkeni 1 ise ptr’nin adres bileşeni 4 artırılıyor. Bu da dizinin ikinci elemanının bellekte bulunduğu adrestir.

Page 497: C# Akademi 2005

511 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri System.Array dizisinin bir elemanına erişmek ile stack

bölgesinde oluşturacağımız bir dizinin elemanına ulaşmamız arasında zaman açısından büyük bir fark vardır. Bu yüzden yüksek performanslı dizilerle çalışmak için System.Array sınıfının dışında stack tabanlı diziler oluşturmamız gerekir.

Stack tabanlı diziler yönetilemeyen dizilerdir. Yönetilen dizilerde dizinin sınırlarını aşmak mümkün değildir.

Stack tabanlı dizilerde dizinin sınırları belirli değildir ve tabiki dizinin sınırlarını aşmak kısıtlanmamıştır.

Page 498: C# Akademi 2005

512 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri

unsafe static void Main(){

int * dizi = stackalloc int[10];

for(int i=0; i<10;++i)Console.WriteLine("*(dizi+{0}) = {1}",i,dizi[i]);

}

stack bellek blgesinde 10*sizeof(int) = 40 bytelık bir alan programcının kullanması için tahsis edilir.

Page 499: C# Akademi 2005

513 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri Stack tabanlı dizilerin sınırları aşıldığında herhangi bir uyarı verilmez. Program başırıyla derlenir ancak çalışma zamanında bize ait olmayan bir

adresin içeriğini değiştirmiş oluruz.

unsafe static void Main(){

int * dizi = stackalloc int[10];

for(int i=0; i<50;++i)*(dizi+i) = i;

}

Page 500: C# Akademi 2005

514 (http://www.csharpnedir.com)

Göstericiler ile Dizi İşlemleri Çalışma zamanında kullanıcın belirlediği sayıda elemana sahip olan bir

ardışıl bellek bölgesi tahsis edilebilir.

unsafe static void Main(){

Console.Write("Dizi boyutu gir: ");uint boyut=0;try{

boyut = Convert.ToUInt32(Console.ReadLine());}catch(FormatException e){Console.WriteLine(e.Message);}

int * dizi = stackalloc int[(int)10];for(int i=0; i<(int)boyut; ++i){

*(dizi+i) = i;Console.WriteLine(dizi[i]);

}}

Page 501: C# Akademi 2005

515 (http://www.csharpnedir.com)

Yapı(struct) Türünden Göstericiler Yapının üye elemanlarının tamamının değer tipi olma zorunluluğu vardır.

struct Yapı{

int x;char c;public Yapı(int x,char c){

this.x = x;this.c = c;

}}class StackAlloc{

unsafe static void Main(){

Yapı yapi = new Yapı(2,'a');Yapı* pYapı = &yapi;

}}

Page 502: C# Akademi 2005

516 (http://www.csharpnedir.com)

Yapı(struct) Türünden Göstericiler Yapı göstericileri üzerinden yapı göstericisinin adresine ilişkin nesnelerin

elemanlarına özel bir operatör olan -> operatörü ile erişebiliriz.

unsafe static void Main(){

Yapı yapi = new Yapı(2,'a');Yapı* pYapı = &yapi;Console.WriteLine("yapi.x= " + pYapı->x);Console.WriteLine("yapi.c= " + pYapı->c);

}

Page 503: C# Akademi 2005

517 (http://www.csharpnedir.com)

Yapı(struct) Türünden Göstericiler Bir yazıyı karekter dizisi olarak temsil edip yazılar ile ilgili işlemler

yapılabilir. Karakter dizileri ile ilgili en önemli nokta bir yazıyı char türden bir

göstericiye atayabilmemizdir. C#’taki string türü managed type olduğu için char türden bir göstericiye

bir yazının ilk karekterinin adresini atamak için fixed anahtar sözcüğünü kullanmalıyız.

Page 504: C# Akademi 2005

518 (http://www.csharpnedir.com)

Yapı(struct) Türünden Göstericiler

class KarakterDizisi{

unsafe static void Main(){

fixed(char* ptr = "Sefer Algan"){

for(int i=0; ptr[i] != '\0'; ++i)Console.Write(ptr[i]);

}}

}

belleğe yerleştirilen ‘n’ karakterinden sonra null değerini ifade eden ‘\0’ karekter yerleştirilir. Bu karektere rastlanıldığı zaman yazının sonuna gelmiş bulunuyoruz.

Page 505: C# Akademi 2005

519 (http://www.csharpnedir.com)

Koleksiyonlar Koleksiyon tabanlı sınıflar aynı türden yada farklı

türden birden fazla nesneyi bir arada tutup bu nesnelere farklı yollardan erişmemizi sağlarlar.

.Net Framework’te koleksiyon sınıfları System.Collections isim alanında tutulurlar.

System.Collections isim alanındaki en önemli sınıflar, ArrayList, SortedList, BitArray, Hashtable, Stack ve Queue sınıflarıdır.

Page 506: C# Akademi 2005

520 (http://www.csharpnedir.com)

Koleksiyonlar Koleksiyon tabanlı nesneler Array nesnelerinden

farklıdır. Herşeyden önce bu koleksiyon nesnelerinin tanımlanması için new anahtar sözcüğü koleksiyon ismi ile kullanılmalıdır.

Koleksiyon tabanlı nesneler Array sınıfındaki gibi System isim alanında değildir. Bütün Koleksiyon sınıfları System.Collections isim alanında bulunur.

Bir koleksiyon nesnesi içinde bulanan elemanlara foreach döngüsü ile erişebilmemiz mümkündür.

Her koleksiyon sınıf IEnumerable arayüzünü uygular.

Page 507: C# Akademi 2005

521 (http://www.csharpnedir.com)

Koleksiyonlar ArayüzleriICollection

Bu arayüz bir kolleksiyonda olabilecek en temel metotları ve özellikleri içerir.

IComparer Bu arayüz iki nesnenin ne şekilde karşılaştırılacağını uygulayan Compare() isimli metot bulundurur. Bu metodun prototipi aşağıdaki gibidir.

IDictionary Bu arayüzü bir anahtar değer ikilisi gibi çalışan koleksiyon sınıflarının uygulaması gerekir.

IDictionaryEnumerator

Bu arayüz ile anahtar değer ikili çiftlerden sadece değer, sadece anahtar, yada hem değer hem anahtar çiftlerini elde etmek için Value, Key ve Entry isimli 3 tane özellik bulunur.

Page 508: C# Akademi 2005

522 (http://www.csharpnedir.com)

Koleksiyonlar Arayüzleri

IEnumerable Bir koleksiyon tabanlı sınıfın elemanları arasında ilerlemek için kullanılan GetEnumerator() metodunu tanımlar

IEnumerator Bir kollksiyon sınıfı için kolleksiyondaki her bir elemana erişmek ve diğer işleri yapmak için uygulanması gereken arayüzdür.

IList Bu arayüz bir kolleksiyondaki elemanların herbirine sıfır tabanlı bir indeks ile erişebilmek için çeşitli metotlar ve özellikler içerir.

IHashProvider Bu arayüz Object sınıfındaki GetHashCode() metodunu tanımlar. Bu metoıt ile HashTable sınıfı ile çalışabilmek için bir kod üretilir.

Page 509: C# Akademi 2005

523 (http://www.csharpnedir.com)

ArrayList Sınıfı Klasik dizilerde çalışırken dizinin boyutunun derleme

aşamasında bilinme zorunluluğu vardı. ArrayList ile oluşturacağımız nesneler için böyle bir kısıtlama yoktur. Çalışma zamanında koleksiyona istediğimiz gibi yeni nesneler ekleyebilir ve yeni nesneler çıkarabiliriz.

ArrayList ile farklı türden nesneleri aynı koleksiyon içerisinde saklayabiliriz.

ArrayList ile bir dizinin boyurtunu çalışma zamanında belirleyebiliriz.

ArrayList nesnelerinden çalışma zamanında bir eleman da çıkarabiliriz.

Page 510: C# Akademi 2005

524 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfı, ICollection, IEnumerable, IList ve ICloneable

arayüzlerini uygulamaktadır. Bir ArrayList’e eklenen elemanlar object türüne aktarılarak

saklanır. Dizideki elemanlara tekrar ulaşabilmek için object

nesnelerinden orijinal sınıf türüne geri dönmemiz gerekir.

Page 511: C# Akademi 2005

525 (http://www.csharpnedir.com)

ArrayList Sınıfıusing System.Collections;class Koleksiyon{

public static void Main(){

ArrayList AList = new ArrayList();Console.WriteLine("Varsayılan kapasite: " + AList.Capacity);

AList.Add(6);AList.Add("CSharp");AList.Add('A');AList.Add(236.58f);AList.Add(true);EkranaYaz(AList);AList.Remove('A');AList.Remove(true);AList.Add("Deneme");EkranaYaz(AList);

}

ArrayList oluşturuluyor.

ArrayList in ilk kapasitesi.

Eleman ekleniyor

Eleman çıkartılıyor.

Page 512: C# Akademi 2005

526 (http://www.csharpnedir.com)

ArrayList Sınıfı

public static void EkranaYaz(ArrayList al){

foreach(object i in al)Console.Write(i.ToString() + " ");

Console.WriteLine();}

Page 513: C# Akademi 2005

527 (http://www.csharpnedir.com)

ArrayList Sınıfı Diziye eklenen her eleman boxing işlemi ile object

referasnlarına dönüştürülür. Bu yüzden dizinin elemanlarına erişmek için boxing işleminin tersi olan unboxing işlemini uygulamamız gerekir.

Page 514: C# Akademi 2005

528 (http://www.csharpnedir.com)

ArrayList Sınıfıclass Deneme{

int x;public Deneme(int x){

this.x = x;}

}

Page 515: C# Akademi 2005

529 (http://www.csharpnedir.com)

ArrayList Sınıfıclass Koleksiyon{

public static void Main(){

ArrayList AList = new ArrayList();AList.Add("Sefer");AList.Add("Algan");AList.Add("Gökçen");AList.Add("Yıldırım");Deneme d = new Deneme(5);AList.Add(d);

foreach(object i in AList)Console.WriteLine((string)i);

}}

?

Program neden hata verir?

Page 516: C# Akademi 2005

530 (http://www.csharpnedir.com)

ArrayList Sınıfı

ArrayList AList = new ArrayList(2);AList.Add(1);AList.Add(2);AList.Add(3);AList.Add(4);AList.Add(5);Console.WriteLine(AList.Capacity);

dizinin kapasitesi artırılcağı zaman mvcut kapasitesinin iki katına çıkarılır.

Ekrana ne yazar??

Page 517: C# Akademi 2005

531 (http://www.csharpnedir.com)

ArrayList Sınıfı bir dizinin herhangi bir yerine bir eleman eklemek için insert

metodu kullanılır.

void Insert(int indeks, object deger)

Page 518: C# Akademi 2005

532 (http://www.csharpnedir.com)

ArrayList Sınıfı Sabit kapasiteli bir ArrayList dizisi de oluşturmak için

ArrayList sınıfının statik metodu olan FixedSize() kullanılır.

ArrayList alist = ArrayList.FixedSize(ArrayList alist);

Dizinin indeksi aşıldığı zaman ArgumentOutOfRangeException hatası fırlatılır.

Page 519: C# Akademi 2005

533 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli özellikleri

Count ArrayList koleksiyonundaki toplam eleman sayısını int türü olarak geri döndürür.

IsFixedSize ArrayList dizisinin sabit kapasiteli olup olmadığını bool olarak geri döndürür.

IsReadOnly Bu özellik ile bir ArrayList dizisinin sadece okunabilir olup olmadığı kontrol edilebilir.

Page 520: C# Akademi 2005

534 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

AddRange(ICollection ic) Bu metot ile ic arayüz referansı ile tutulan koleksiyon nesnesinin elemanları metodu çağıran ArrayList nesnesinin sonun ekler.

Sort()

Bu metot ile ArrayList dizisinin elemanları IComparer arayüzü ile belirlenen kurala göre sıralanır. Sıralama algoritması olarak QuickSort kullanılır.

void Sort()Bu metot dizin elemanlarını varsayılan IComparer arayüzünde belirtilen kurala göre sıralar.

Page 521: C# Akademi 2005

535 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

void Sort(IComparer ic) Bu metot ile belirlenen IComparer karşılaştırma yöntemine göre sıralama işlemi yapılır.

void Sort(int indeks, int adet, IComparer ic)

Bir önceki metot ile aynı işlemi yapar, ancak sıralama işlemi dizinin tamamında değilde indeks elemanından itibaren adet kadar eleman üzerinde yapılır.

Sort() metodunun etkisini görmek için string türden elemanlar içeren bir ArrayList dizisini sıraldıktan sonra ekrana yazdırmayı deneyin.

?

Page 522: C# Akademi 2005

536 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

int BinarySearch(object o)Sıralanmış diziler içinde parametre olarak verilen nesne aranır.

int BinarySearch(object o, IComparer ic)

Bu metot daha çok programcının tanımladığı türden eleman içeren koleksiyonları sıralamak için kullanılır.

int BinarySearch(int indeks, int adet, object o, IComparer ic)

Arama işlemi dizinin indeks elemanında itibaren adet sayıda eleman içerisinde yapılır.

Page 523: C# Akademi 2005

537 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

void Reverse() Bu metodu çağıran dizinin elemanları ters çevrilir.

void Reverse(int indeks, int adet)

Ters çevirme işlemi sadece indeks elemanından itibaren adet kadar eleman üzerinde gerçekleşir.

void Clear() ArrayList dizisinin bütün elemanları diziden çıkarılır.

void TrimToSize( )ArrayList dizisinde kapasitenin eleman sayısından fazla olduğu durumda kapasiteye eleman sayısına eşitlemek için kullanılır.

bool Contains(object o)

Parametre ile verilen nesnenin dizi elemanları içerisinde bulunup bulunmadığı ture yada false olarak geri döndürülür.

Page 524: C# Akademi 2005

538 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

void CopyTo()Bu metot ile ArrayList sınıfının bütün elemanları klasik dizilere kopyalanır.

void CopyTo(Array a)Bu metodu çağıran ArrayList dizisinin bütün elemanları tek boyutlu a dizisine kopyalanır.

void CopyTo(Array a, int indeks)

Birinci metot ile aynı işlemi yapar, tek değişen a dizisine kopyalama işleminin, a dizisinin indeks nolu elemanından itibaren olmasıdır.

void CopyTo(int indeks, Array a,int dizi_indeks, int adet)

Bu metedo çağıran ArrayList nesnesinin indeks elemanından itibaren adet kadar eleman a dizisinin dizi_indeks elemaından itibaren a ile belirtilen diziye kopyalanır.

ArrayList GetRange(int indeks, int adet)

Metodu çağıran dizinin indeks elemanından itibaren adet kadar elemanı yeni bir ArrayList nesnesi olarak geri döndürülür.

Page 525: C# Akademi 2005

539 (http://www.csharpnedir.com)

ArrayList Sınıfı ArrayList sınıfının önemli metodları

int IndexOf(object o)Parametre ile belirtilen nesnenin ilk olarak bulunduğu elemanın indeks numarısını geri döndürür.

object[] ToArray()Bu metot ArrayList dizisinin elemanlarını yeni bir object türünden dizie aktarıp bu dizinin referasnı ile geri döner.

void RemoveAt(int indeks)

Bu metot ArrayList dizisindeki indeks nolu elemanı diziden çıkarır.

Page 526: C# Akademi 2005

540 (http://www.csharpnedir.com)

HashTable Koleksiyonu Indeks numarası yerine bir koleksiyondaki elemanlara bir

anahtar değer ile erişmek için Sytem.Collections isim alanında bulunan Hashtable sınıfı kullanılır.

HashTable sınıfında koleksiyonlar bir anahtar(key), deger(value) ikilisi olarak saklanır.

Hashtablo ile anahtar ve değer ikilisi hash tablosu denilen bir tabloda saklamaktadır.

Hashtable sınıfında anahtarlar Key, değerlerde Value olarak adlandırılır.

Page 527: C# Akademi 2005

541 (http://www.csharpnedir.com)

HashTable KoleksiyonuHashtable Sozluk = new Hashtable();

Sozluk.Add("Araba", "Car");

Sozluk.Add("Masa", "Table");

Sozluk.Add("Kalem", "Pencil");

Sozluk["Kitap"] = "Book";

Sozluk["Bilgisayar"]= "Computer";

ICollection anahtarlar = Sozluk.Keys;

foreach(string anahtar in anahtarlar)

Console.WriteLine(anahtar + " = " + Sozluk[anahtar]);

Console.WriteLine("Toplam kelime: " + Sozluk.Count);

HashTable oluşturuluyor.

Anahtar değer ekleniyor.

Anahtar (key)

Değer (value)

Bilgisayar isimli anahtarın değeri değiştiriliyor.

Koleksiyondaki her bir anahtarın değeri elde ediliyor.

!

Page 528: C# Akademi 2005

542 (http://www.csharpnedir.com)

HashTable Koleksiyonu Hashtable nesnelerinin dizilerden en büyük farkı

koleksiyondaki elemanlara bir indeks ile değil bir anahtar ile erişebilmemizdir.

Page 529: C# Akademi 2005

543 (http://www.csharpnedir.com)

HashTable Koleksiyonu Bir Hashtable nesnesindeki her anahtar-değer çifti arasında

dolaşmak içi IDictionaryEnumerator arayüzünüde kullanabiliriz.

Bu arayüzün Key ve Value özellikleri ile anahtar-değer çiftlerine erişebiliriz.

Ayrıca IDictionaryEnumerator arayüzündeki MoveNext() metodu ile anahtar-değer çiftlerini tek tek elde edebiliriz.

Page 530: C# Akademi 2005

544 (http://www.csharpnedir.com)

HashTable KoleksiyonuHashtable Sozluk = new Hashtable();

Sozluk.Add("Araba", "Car");

Sozluk.Add("Masa", "Table");

Sozluk.Add("Kalem", "Pencil");

Sozluk["Kitap"] = "Book";

Sozluk["Bilgisayar"]= "Computer";

IDictionaryEnumerator ide = Sozluk.GetEnumerator();

while(ide.MoveNext())

Console.WriteLine(ide.Key + " = " + ide.Value);

Console.WriteLine("Toplam kelime: " + Sozluk.Count);

Page 531: C# Akademi 2005

545 (http://www.csharpnedir.com)

HashTable Koleksiyonu

void Clear() Hashtable koleksiyonundaki bütün anahtar-değer çiftlerini siler.

bool ContainsKey(object anahtar)

Parametre ile verilen anahtarın Hashtable nesnesi içinde bulunup bulunmadığını kontrol eder.

bool ContainsValue(object deger)

parametre ile verilen değerin Hashtable nesnesi içinde bulunup bulunmadığını kontrol eder.

void CopyTo(Array dizi, int indeks)

Hashtable içindeki anahtar-değer çiftlerini bir boyutlu Array dizisine indeks elemanından itibaren kopyalar.

Page 532: C# Akademi 2005

546 (http://www.csharpnedir.com)

Sorted List Koleksiyonu Hem anahahtar-değer ikilileri hemde bu

ikili anahtar-değer çiftine bir indeks numarasına göre erişilebilmesini sağlar.

SortedList yapısının en belirgin özelliği sıralı olmasıdır.

Page 533: C# Akademi 2005

547 (http://www.csharpnedir.com)

Sorted List Koleksiyonupublic static void Main(){

string[] Kelimeler = {"Araba","Masa","Defter","Kitap","Okul"};

SortedList Sozluk = new SortedList();Sozluk.Add("Araba", "Car");Sozluk.Add("Masa", "Table";Sozluk.Add("Kalem", "Pencil");Sozluk["Kitap"] = "Book";Sozluk["Bilgisayar"]= "Computer";EkranaYaz(Sozluk);for(int i=0; i < Kelimeler.Length; ++i)

if(Sozluk.ContainsKey(Kelimeler[i]))Console.WriteLine(Kelimeler[i]+"="+Sozluk[Kelimeler[i]]);

elseConsole.WriteLine(Kelimeler[i]+",sözlükte bulunamadı.");

Console.WriteLine();

SortedList oluşturuluyor.

Key-value çiftleri ekleniyor.

i indisli eleman var mı?

Page 534: C# Akademi 2005

548 (http://www.csharpnedir.com)

Sorted List KoleksiyonuSozluk.Add("Doğru","Line");

EkranaYaz(Sozluk);

Console.WriteLine();

Console.WriteLine("Sıralı listede toplam {0} eleman  bulunmaktadır. ",

Sozluk.Count);

Console.Write("Bu elemanlar: ");

ICollection anahtarlar = Sozluk.Keys;

foreach(string str in anahtarlar)

Console.Write(str + "-");

}

Elemanlar, ICollection arayüzü uygulanarak elde ediliyor.

Page 535: C# Akademi 2005

549 (http://www.csharpnedir.com)

Sorted List Koleksiyonu

public static void EkranaYaz(SortedList slist){

foreach ( DictionaryEntry de in slist )Console.WriteLine("{0,-12}:{1,- 12}",de.Key,de.Value);

Console.WriteLine();}

Elemanlara DictionaryEntry nesnesi elemanı olarak erişiliyor.

Page 536: C# Akademi 2005

550 (http://www.csharpnedir.com)

BitArray Koleksiyonu BitArray sınıfı bitlerle işlem yapmak için

özelleştirilmiş bir koleksiyon sınıfıdır. BitArray ile bir sayının bitlerine tek tek

erişebileceğimiz gibi bitsel AND ve XOR gibi bitsel işlemler de gerçekleştirebiliriz.

Page 537: C# Akademi 2005

551 (http://www.csharpnedir.com)

BitArray Koleksiyonuusing System.Collections;class bitarray{

public static void Main(){

int[] bdizi1 = {1};BitArray bArray1 = new BitArray(bdizi1);byte[] bdizi2 = {1,2};BitArray bArray2 = new BitArray(bdizi2);BitArray bArray3 = new BitArray(5,true);bool[] bdizi3 = {true,false,false,true,true};BitArray bArray4 = new BitArray(bdizi3);

EkranaYaz(bArray1);EkranaYaz(bArray2);EkranaYaz(bArray3);EkranaYaz(bArray4);

}

BitArray koleksiyonlarının aşırı yüklenmiş yapıcıları ile oluşturulması.

Page 538: C# Akademi 2005

552 (http://www.csharpnedir.com)

BitArray Koleksiyonupublic static void EkranaYaz(BitArray bArray)

{

IEnumerator ie = bArray.GetEnumerator();

int i=0;

while(ie.MoveNext())

{

i++;

Console.Write("{0,-5} ",ie.Current);

if(i%8==0)

Console.WriteLine();

}

Console.WriteLine();

}

}

IEnumerator arayüzü uygulanarak BitArray elemanları elde ediliyor.

Döngü içinde sırası gelen BitArray elemanı alınıyor.

Page 539: C# Akademi 2005

553 (http://www.csharpnedir.com)

BitArray Koleksiyonu Önemli Metodlar

bool Get(int indeks)Bu metot koleksiyondaki indeks nolu elemanın değerini geri döndürür.

void Set(int indeks, bool deger)

Bu metot koleksiyondaki indeks nolu elemanın değerini ikinci parametre ile verilen değer ile değiştirir.

void SetAll(bool deger)koleksiyondaki bütün elemanlar true yada false değerine çekilebilir.

BitArray And(BitArray koleksiyon)

koleksiyondaki her bir elemanın değeri ile metodu çağıran koleksiyonun elemanları karşılıklı olarak bitsel ve işlemine tabi tutulur.

BitArray Or(BitArray koleksiyon)

And() metodu ile aynı mantıkta çalışır. Değişen tek şey bitsel işlemin ‘ve’ yerine ‘veya’ olmasıdır.

Page 540: C# Akademi 2005

554 (http://www.csharpnedir.com)

BitArray Koleksiyonu Önemli Metodlar

BitArray Xor(BitArray koleksiyon)

And() ve Or() metotları ile aynı mantıkta çalışır. Değişen tek şey ise bitsel işlemin ‘özel veya’ olmasıdır.

BitArray Not()Metodu çağıran koleksiyondaki her bitin bitsel değilini alın ve yeni bir koleksiyon nesnesi referasnı ile geri döner.

Page 541: C# Akademi 2005

555 (http://www.csharpnedir.com)

BitArray Koleksiyonuclass bitarray{

public static void Main(){

byte[] bdizi1 = {165};BitArray bArray1 = new BitArray(bdizi1);

byte[] bdizi2 = {98};BitArray bArray2 = new BitArray(bdizi2);

EkranaYaz("BitArray1",bArray1);EkranaYaz("BitArray2",bArray2);EkranaYaz("And",bArray1.And(bArray2));EkranaYaz("Or",bArray1.Or(bArray2));EkranaYaz("Xor",bArray1.Xor(bArray2));EkranaYaz("Not",bArray1.Not());

}

Page 542: C# Akademi 2005

556 (http://www.csharpnedir.com)

BitArray Koleksiyonupublic static void EkranaYaz(string str,BitArray bArray){

IEnumerator ie = bArray.GetEnumerator();int i=0;Console.WriteLine("["+str+"]");while(ie.MoveNext()){

i++;Console.Write("{0,-5} ",ie.Current);if(i%8==0)

Console.WriteLine();}Console.WriteLine();

}}

Elemanlar elde ediliyor.

Elemanlar arasında geziliyor.

Page 543: C# Akademi 2005

557 (http://www.csharpnedir.com)

Stack Koleksiyonu Yığınlar bir veri grubudur; öyleki bu gruptan belli bir anda

ancak gruba en son eklenen elemanın değeri elde edilebilir.

Bir anda değeri elde edilebilecek bu eleman gruba eklenen son elemandır.

Gruba giren ilk elemanı elde etmek için ilk eleman dışındaki bütün elemanların gruptan çıkması gerekir.

Son Giren İlk Çıkar(Last In First Out)

Page 544: C# Akademi 2005

558 (http://www.csharpnedir.com)

Stack Koleksiyonu Yığın ve benzeri veri gruplarında Pop() ve Push() gibi iki önemli

metod bulunur. Pop() metodu bir yığından, yığına son eklenen elemanı çıkarır

ve bu çıkarılan elemanın değeri ile geri döner. Push() metodu ise yığına yeni bir eleman eklemek için kullanılır.

Page 545: C# Akademi 2005

559 (http://www.csharpnedir.com)

Stack Koleksiyonupublic static void Main(string[] args){

Stack yigin = new Stack(); yigin.Push(5);yigin.Push(98);yigin.Push(17);yigin.Push(4);yigin.Push(88);yigin.Push(65);Console.WriteLine("Yığımızın ilk hali...");EkranaYaz(yigin);int sayi = (int)yigin.Pop();Console.WriteLine("\nYığından {0} sayısını aldık", sayi);sayi = (int)yigin.Pop();Console.WriteLine("\nYığından {0} sayısını aldık", sayi);sayi = (int) yigin.Peek();Console.WriteLine("\nYığının tepesindeki sayı şu anda : {0}", sayi);

}

Yeni bir yığın tanımlanıyor.

Yığına çeşitli değerler ekleniyor.

Yigininin tepesindeki sayıyı alıyoruz.

Bu sayıyı yığından çıkarmıyoruz. Sadece ne olduğuna bakıyoruz.

Page 546: C# Akademi 2005

560 (http://www.csharpnedir.com)

Stack Koleksiyonupublic static void EkranaYaz(Stack yigin){

object obj = new Object();Stack yeniYigin = (Stack)yigin.Clone();if(yigin.Count!=0){

while(yeniYigin.Count>0)Console.WriteLine("\t"+

yeniYigin.Pop().ToString()); } else

Console.WriteLine("Yığın boş!");}

Bu programdaki EkranaYaz() metodunu IEnumerator arayüzünü kullanarak nasıl yazarız? ?

Page 547: C# Akademi 2005

561 (http://www.csharpnedir.com)

Queue Koleksiyonu Queue bir kuyruğu temsil eder. Kuyrukta ilk giren ilk çıkar

mantığı vardır. Kuyruğun en başındaki elemanı çıkarmak ve bu eleman ile

geri dönmek için Dequeue() metodu kullanılır. Enqueue() metodu ile de parametre olarak verilen object

nesnesi kuyruğun sonuna eklenir. Peek() metodu ise kuyruktaki ilk elemanın değerini döndürür

ancak kuyruktan bu elemanı çıkarmaz.

Page 548: C# Akademi 2005

562 (http://www.csharpnedir.com)

Queue Koleksiyonupublic static void Main(){

Queue kuyruk = new Queue(); kuyruk.Enqueue("İhsan");kuyruk.Enqueue("Sefer");kuyruk.Enqueue("Tahir");kuyruk.Enqueue("Yusuf");Console.WriteLine("Kuyruğun ilk hali.");EkranaYaz(kuyruk);string isim = (string)kuyruk.Dequeue();Console.WriteLine("\nKuyruktan {0} yazısını aldık", isim);isim = (string)kuyruk.Dequeue();Console.WriteLine("\nKuyruktan {0} yazısını aldık",  isim);isim = (string)kuyruk.Peek();Console.WriteLine("\nKuyruğun tepesindeki yazı şu anda : {0}", isim);

}

Yeni bir kuyruk tanımlanıyor.

Kuruğa çeşitli değerler ekleniyor.

Kuyruğun başından bir eleman alıyoruz.

Kuyruğun tepesinden eleman alıyoruz.

Page 549: C# Akademi 2005

563 (http://www.csharpnedir.com)

Queue Koleksiyonupublic static void EkranaYaz(Queue kuyruk){

IEnumerator ie = kuyruk.GetEnumerator();

while(ie.MoveNext())Console.WriteLine("\t" + ie.Current);

}}

Kuyruk elemanları elde ediliyor.

Kuyruktaki elemanlar arasında geziliyor ve güncel elemanlar ekrana yazdırılıyor.

Page 550: C# Akademi 2005

564 (http://www.csharpnedir.com)

COM Nesnelerinin KullanımıCOM Nesnelerinin Kullanımı

Native(Doğal) KodNative(Doğal) Kod

COMCOMRCWRCW

COM MarshallingCOM MarshallingRCW : Runtime Callable WrapperRCW : Runtime Callable Wrapper

Yönetilen KodYönetilen Kod

.NET.NET

Page 551: C# Akademi 2005

565 (http://www.csharpnedir.com)

COM Nesnelerinin Kullanımı

Tlbimp /namespace:CsNedir /out:COM_RCW /verbose VbCOM.dll

Register Edilmiş Olmalı(regsvr32.exe)

Page 552: C# Akademi 2005

566 (http://www.csharpnedir.com)

ActiveX Bileşenlerinin KullanımıWindows Media Player

ActiveX dosyası : msdxm.ocx dosyası X:/WINNT/System32

AxImp C:\Windows\System32\msdxm.ocx

Page 553: C# Akademi 2005

567 (http://www.csharpnedir.com)

.NET Nesnelerinin Kullanımı(COM’da).NET Nesnelerinin Kullanımı(COM’da)

Native(Doğal) KodNative(Doğal) Kod

COMCOMCCWCCW

COM MarshallingCOM MarshallingCCW : COM Callable WrapperCCW : COM Callable Wrapper

Yönetilen KodYönetilen Kod

.NET.NET

Page 554: C# Akademi 2005

568 (http://www.csharpnedir.com)

Kurallar - 1Kurallar - 11 - Sadece public olan elemanlar COM istemcileri tarafından erişilebilir durumdadır. Bu yüzden eğer .NET türlerine(type) COM istemcileri tarafından erişilmesi isteniyorsa türler public olarak işaretlenmelidir.

2 - Bazı üye elemanlar COM istemciler tarafından kullanılamayabilir. Örneğin parametreli yapıcı metotlara, statik metotlara ve sabit alanlara(fields) COM istemcileri erişemez.

3 - COM istemcileri tarafından erişilecek üye elamanlar public olmalıdır. Örneğin bir metot public bir sınıf içerisinde olsa bile bu metodun COM tarafından erişilir bir durumda olması için metodun public olarak bildirilmiş olması gerekir. Bu kural diğer üye elemanlar olan özellikler(properties), olaylar(events) ve diğer veri alanları(fields) için de geçerlidir.

Page 555: C# Akademi 2005

569 (http://www.csharpnedir.com)

Kurallar - 2Kurallar - 24 - COM istencilerinin .NET nesnelerini oluşturabilmesi için .NET türlerinin public olarak bildirilmiş varsayılan yapıcı metoda(default constructor) sahip olması gerekir. (Varsayılan yapıcı metotlar parametre almayan yapıcılardır.)

5 - Özet türler(Abstract Types) COM istemcileri tarafından kullanılamaz.

    [ComVisible(false)]    public int Deneme(int a)

    {        return 0;    }

Page 556: C# Akademi 2005

570 (http://www.csharpnedir.com)

Adımlar – 1 : Sınıf TasarımıAdımlar – 1 : Sınıf Tasarımıusing System;

namespace csharpnedir{    public class DortIslem    {        public int Toplam(int sayi1, int sayi2)         {                return sayi1 + sayi2;        }        private int Carp(int sayi1, int sayi2)         {                return sayi1 * sayi2;        }    }}

Page 557: C# Akademi 2005

571 (http://www.csharpnedir.com)

Adımlar – 2 : DLL’i GAC’a AtıyoruzAdımlar – 2 : DLL’i GAC’a Atıyoruz

sn /k anahtar.snk

[assembly: AssemblyKeyFile("../../anahtar.snk")]

gacutil /i Toplama.dll

Page 558: C# Akademi 2005

572 (http://www.csharpnedir.com)

Adımlar – 3 : Register EdiyoruzAdımlar – 3 : Register Ediyoruz

regasm.exe Toplama.dll

Types registered successfully

Page 559: C# Akademi 2005

573 (http://www.csharpnedir.com)

Adımlar – 4 : ASP’de KullanıyoruzAdımlar – 4 : ASP’de Kullanıyoruz//deneme.asp (http://localhost/deneme.asp şeklinde çağrılmalıdır) <html><form action = "deneme.asp" method=post>Sayı 1 = <input type = text name="sayi1"><br>Sayı 2 = <input type = text name="sayi2"><br><input type=submit value="Topla"></form><%Dim o,r,i1,i2Set o = Server.CreateObject("csharpnedir.Dortislem")i1 = cint(request.form("sayi1"))i2 = cint(request.form("sayi2"))r = o.Toplam(i1,i2)response.write "Toplam = " & r%></html>

Page 560: C# Akademi 2005

574 (http://www.csharpnedir.com)

Adımlar – 5 : SonuçAdımlar – 5 : Sonuç

Page 561: C# Akademi 2005

575 (http://www.csharpnedir.com)

Ağ Uygulamaları – System.NetAğ Uygulamaları – System.Net

WebRequest Sınıfı

static WebRequest Create(string uri)

static WebRequest Create(Uri uri)

stream GetRequestStream()

Stream GetResponse()

Page 562: C# Akademi 2005

576 (http://www.csharpnedir.com)

Ağ Uygulamaları – System.NetAğ Uygulamaları – System.Net

WebResponse Sınıfı

long ContentLength{get;set;}

string ContentType{get;set;}

webHeaderCollection {get;}

Stream GetResponseStream()

Page 563: C# Akademi 2005

577 (http://www.csharpnedir.com)

Ağ Uygulamaları – System.NetAğ Uygulamaları – System.Net

HttpWebResponse-HttpWebRequest Örneği

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(“http://www...”);

HttpWebResponse res = (HttpWebResponse) req.GetResponse();

Stream akim = res.GetResponseStream();

Page 564: C# Akademi 2005

578 (http://www.csharpnedir.com)

Soket Tabanlı ProgramlamaSoket Tabanlı Programlama

TcpListenerSocket

NetworkStreamTcpClient

Kullanılan Sınıflar

Page 565: C# Akademi 2005

579 (http://www.csharpnedir.com)

ADO.NET Nedir? ADO.NET veritabanlarındaki bilgileri elde etmek

veya veritabanında bulunan verileri değiştirmek için geliştirilmiş bir veri erişim aracıdır.

ADO.NET, .NET sınıf kütüphanesindeki System.Data isim alanındaki sınıfların tamamını temsil eder.

ADO.NET, .NET platformu için geliştirilmiş, offline çalışma sistemini destekleyen, web uygulamaları gibi n-katmanlı uygulamarda büyük kolaylık sağlayan yeni bir veri erişim teknolojisidir.

Page 566: C# Akademi 2005

580 (http://www.csharpnedir.com)

ADO ve ADO.NETADO ADO.NET

ADO nesne modeli 6 temel yapıdan oluşmaktadır.Bunlar:

-Connection Nesnesi-Recordset Nesnesi-Command Nesnesi-Error Nesnesi-Field Nesnesi-Parametre Kolleksiyonu

ADO.NET modeli veriye erişim olarak iki ana metod kullanır.

Online Erişim (Connected Access)Offline Erişim (Disconnected Access)

ADO, Recordset nesnesi ile offline çalışma modeline sınırlı bir imkan sağlar

ADO.NET iki yeni nesne modeli sunar.Bunlar DataSet ve DataAdapter nesneleridir. Bu yapıların ikiside offline çalışma için gereklidir. DataSet tasarım olarak her zaman offline çalışacak şekilde düzenlenmiştir.

Page 567: C# Akademi 2005

581 (http://www.csharpnedir.com)

ADO ve ADO.NETADO ADO.NET

ADO modelinde çok fazla kullanılmayan bazen de hiç kullanılmayan yapılar uygulamanın performansını düşürür.

ADO.NET modeli ise daha yüksek performans sağlar.

Doğrudan bir XML desteği yoktur.

Doğrudan XML desteği verir. ADO.NET, XML ile entegre çalıştığı için bir tablodaki verileri XML formatına dönüştürmek çok basittir. Eski ADO da ise böyle bir durum söz konusu değildir.

Page 568: C# Akademi 2005

582 (http://www.csharpnedir.com)

ADO.NET Nesne Modeli

Connection

Transaction

DataAdapter

Command

Parameter

DataReader

Connected(Bağlantılı)Nesneler

Page 569: C# Akademi 2005

583 (http://www.csharpnedir.com)

ADO.NET Nesne Modeli

DataSet

DataTable

DataRow

DataColumn

Constraint

DataRelation

DataView

Disconnected(Bağlantısız)

Nesneler

Page 570: C# Akademi 2005

584 (http://www.csharpnedir.com)

ADO.NET Nesne Modeli

Page 571: C# Akademi 2005

585 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları) Veri sürücüleri uygulamalarımız ile, veritabanı arasındaki

iletişimi sağlarlar. Veri kaynaklarına erişmek için kullanılan sistem sürücüleri

sistemimize dll kütüphaneleri olarak yüklenir ve kendilerini sisteme kayıt ederler(register). Bu noktadan itibaren bu veri sürücülerinin içerdiği fonksiyonları kullanarak veritabanları üzerinde istediğimiz işlemleri gerçekleştirebiliriz.

ADO.NET ile veritabanı uygulamaları geliştirirken, bu sürücüler üzerinden veritabanlarına erişim sağlarız. Bu sebeple .Net Framework 'te her bir veri sürücüsü için geliştirilmiş veri sağlayıcıları (data providers) vardır.

Page 572: C# Akademi 2005

586 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları)

.Net Framework Veri Sağlayıcıları

   Data Provider For SQL Server

   Data Provider For OLE DB

   Data Provider For ODBC

   Data Provider For Oracle

Page 573: C# Akademi 2005

587 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları)SQL veri sağlayıcısına ait tüm üyeler, System.Data.SQLClient isim uzayında yer almaktadır.

SQL veri sağlayıcısının en önemli özelliği, sql motoruna direkt sql api'si üzerinden erişim sağlayabilmesidir.

Bu özellik ona diğer veri sağlayıcılarına göre daha yüksek performans kazandırır.

Sql veri sağlayıcısı, sql server'ın 7.0 ve sonraki sürümlerinde özellikle çok katlı uygulamalarda yüksek verim ve performans sağlar.

Page 574: C# Akademi 2005

588 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları)Ole Db veri sağlayıcısı, Ole Db desteği veren tüm veri sürücüleri ile ilişki kurabilmektedir. Bunu yaparken, Ole Db Com nesnelerini kullanır.

Ole Db veri sağlayıcısının .net framework üyeleri, System.Data.OleDb isim uzayında yer alır.

Ole Db veri sağlayıcısı, com servsileri ile veri sürücülerine eriştiği için, özellikle sql veri sağlayıcısına göre çok daha düşük bir performans sergiler.

Page 575: C# Akademi 2005

589 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları)ODBC veri sağlayıcısı, Ole Db veri sağlayıcısı gibi, ODBC desteği veren sürücüler ile, ODBC Servis Component'lerini kullanarak iletişim kurar.

ODBC veri sağlayıcısı ile ilgili üyeler, .net framework içinde, System.Data.Odbc isim uzayında yer almaktadır.

Ole Db veri sağlayıcısı, com servsileri ile veri sürücülerine eriştiği için, özellikle sql veri sağlayıcısına göre çok daha düşük bir performans sergiler.

Page 576: C# Akademi 2005

590 (http://www.csharpnedir.com)

Data Providers (Veri Sağlayıcıları)

Oracle servis sağlayıcısı, .net framework'ün System.Data.OracleClient isim uzayında yer alan üyelerden oluşur.

Oracle servis sağlayıcısı, Oracle veri kaynaklarına erişebilmek için, sql veri sağlayıcısı gibi kendi iletişim protokünü içeren Oracle Client Connectivity'yi kullanır.

Oracle veri sağlayıcısının .net'e yerleştirilmesindeki temel amaç, oracle veri tabanlarına ole db veri sağlayıcısı ile ole db üzerinden değil, doğrudan erişilebilmesini sağlamaktır.

Bu sayede oracle veri kaynağı ile oluşturulan etkileşimde en iyi performansın elde edilmesi sağlanmıştır.

Page 577: C# Akademi 2005

591 (http://www.csharpnedir.com)

Connection ( Bağlantı ) ADO.NET mimarisinde, pek çok sınıfın veri kaynakları ile

olan iletişiminde Connection (Bağlantı) nesnelerini kullanırız. Connection(bağlantı) sınıfları, veri kaynağına bir hat çekerek,

ADO.NET nesnelerinin bu hat yardımıyla işlemlerini gerçekleştirmelerine imkan sağlarlar.

Connection Nesneleri

OleDbConnection

SqlConnection

ODBCConnection

OracleConnection

Page 578: C# Akademi 2005

592 (http://www.csharpnedir.com)

Connection ( Bağlantı )OleDbConnection

Page 579: C# Akademi 2005

593 (http://www.csharpnedir.com)

Connection ( Bağlantı )OleDbConnection conFriends=new OleDbConnection();                              

conFriends.ConnectionString="Provider=SQLOLEDB;Data

Source=localhost;Database=Friends;Integrated Security=SSPI";

try

{

       conFriends.Open();

       Console.WriteLine("Bağlantı açıldı...");

      conFriends.Close();

       Console.WriteLine("Bağlantı kapatıldı...");

}

catch(Exception hata)

{

       Console.WriteLine(hata.Message.ToString());

}

Page 580: C# Akademi 2005

594 (http://www.csharpnedir.com)

Connection ( Bağlantı )

                            

conFriends.ConnectionString= “ Provider = SQLOLEDB ; Data

Source = localhost ; Database = Friends ; Integrated Security = SSPI ";

Sql Sunucusu için OleDb veri sürücüsü bildirimi

Bağlanılmak istenen Sql sunucusunun adı.

Bağlanılmak istenen Sql Veritabanının adı.

Güvenlik. Sql sunucusuna bağlanma yetkisi olan her windows kullanıcısı, bu bağlantıyı açabilir.

Page 581: C# Akademi 2005

595 (http://www.csharpnedir.com)

Connection ( Bağlantı )

 conFriends.ConnectionString="Provider=SQLOLEDB;Data

Source = localhost ; Database = Friends ; User Id = sa ; Password = Urs89.?";

Bir kullanıcı adı ve şifresi ile Sql Sunucusuna bağlanmaya çalışılır.

Page 582: C# Akademi 2005

596 (http://www.csharpnedir.com)

Connection ( Bağlantı )

OleDbConnection conYazarlar=new OleDbConnection ( “ Provider =

Microsoft.Jet.OLEDB.4.0 ; data source = c:\\Authors.mdb“ );

Access Veritabanına bağlantı

Access Veritabanı için veri sürücüsü bildiriliyor.

Access Veritabanının yeri tam yol adresi ile bildiriliyor.

Page 583: C# Akademi 2005

597 (http://www.csharpnedir.com)

Connection ( Bağlantı )OleDbConnection conFriends=new OleDbConnection(); conFriends.ConnectionString="Provider=SQLOLEDB;Data Source=localhost;Database=Friends;User Id=sa;Password=sa.; ConnectionTimeout=10";try{     conFriends.Open();      Console.WriteLine("Baglanti açildi...");     conFriends.Close();      Console.WriteLine("Baglanti kapatildi...");}catch(Exception hata){     Console.WriteLine(hata.Message.ToString());}

Belirtilen sürede Sql Veritabanına bağlanılamassa bir istisna fırlatır.

Page 584: C# Akademi 2005

598 (http://www.csharpnedir.com)

Connection ( Bağlantı )

OleDbConnection conFr=new OleDbConnection();

conFr.ConnectionString="Provider=SQLOLEDB;Data

Source=localhost;Database=Friends;Integrated Security=SSPI";

conFr.Open();

Console.WriteLine("Veritabanı "+conFr.Database.ToString());

conFr.ChangeDatabase("pubs");

Console.WriteLine("Şimdiki veritabanı "+conFr.Database.ToString());

conFr.Close();

Bağlı olunan veritabanı adını verir.

Veritabanını değiştirir.

Açık bağlantıda Database dinamik olarak değiştirilebilir.

Page 585: C# Akademi 2005

599 (http://www.csharpnedir.com)

Command Kavramı Ado.Net Command nesneleri, kullanıldıkları veri kaynakları

üzerinde sql ifadelerinden oluşturulan komutları çalıştırmak için kullanılırlar.

Command Nesneleri

OleDbCommand

SqlCommand

ODBCCommand

OracleCommand

Page 586: C# Akademi 2005

600 (http://www.csharpnedir.com)

Command Kavramı

OleDbConnection con=new OleDbConnection("Provider=SQLOLEDB;data

source=localhost;initial catalog=Friends;integrated security=sspi");

OleDbCommand cmd=new OleDbCommand("Insert Into Siteler

(Baslik,Adres,Resim,Icerik) Values

('C#','www.csharpnedir.com','images/resim1.jpg','C# üzerine her türlü

makale.')“ , con);

Sql Sorgusu Komutun çalıştırılacağı bağlantı hattını temsil eden Connection nesnesi

Page 587: C# Akademi 2005

601 (http://www.csharpnedir.com)

Command KavramıOluşturulan komutların çalıştırılması;

ExecuteNonQuery

ExecuteReader

ExecuteScalar

Command nesnelerinin temsil ettiği sql cümleciklerini çalıştırmamız gerekmektedir. Bu amaçla kullanabileceğimiz üç metod vardır.

Page 588: C# Akademi 2005

602 (http://www.csharpnedir.com)

Command Kavramı Geriye sonuç kümesi döndürmeyecek sorguların çalıştırılmasında

ExecuteNonQuery metodu kullanılır. OleDbCommand cmd=new OleDbCommand("Insert Into Siteler

(Baslik,Adres,Resim,Icerik)

Values('C#','www.csharpnedir.com','images/resim1.jpg','C# üzerine her türlü

makale.')",con);

      try

      {

      con.Open();

      int sonuc=cmd.ExecuteNonQuery();

      Console.WriteLine(sonuc.ToString()+" Kayıt Girildi...");

      }

      catch(Exception hata)

      {      Console.WriteLine(hata.Message.ToString()); }

      finally

      {      con.Close();      }

Page 589: C# Akademi 2005

603 (http://www.csharpnedir.com)

Command KavramıOleDbCommand cmdUpdate=new OleDbCommand("Update Siteler Set Resim =

Resim + 'img' ",con);

      try

      {

      con.Open();

      int Guncellenen=cmdUpdate.ExecuteNonQuery();

      Console.WriteLine(Guncellenen.ToString()+" Kayıt Güncellendi");

      }

      catch(Exception hata)

      {      Console.WriteLine(hata.Message.ToString());      }

      finally

      {      con.Close();      }

Update ile güncellenen kayıt sayısını döndürür.

Page 590: C# Akademi 2005

604 (http://www.csharpnedir.com)

Command Kavramı

ExecuteNonQuery metodu geriye her hangibir sonuç kümesi, herhangibir çıkış parametresi veya çıkış değeri döndürmez.

Page 591: C# Akademi 2005

605 (http://www.csharpnedir.com)

Command KavramıExecuteScalar metodu sadece tek alanlık veri döndüren sql sorguları için kullanılır.

OleDbCommand cmd=new OleDbCommand("Select Baslik From Siteler

Where ID=8",con);

      OleDbCommand cmdToplamSite=new OleDbCommand("Select Count(*)

From Siteler",con);

      try      {

      con.Open();

      Console.WriteLine("ID=8 olan satırın Baslik alanının değeri: "+cmd.

ExecuteScalar() . ToString());

      Console.WriteLine("Site Sayısı: "+cmdToplamSite. ExecuteScalar() .

ToString());      }

      catch(Exception hata)

      {      Console.WriteLine(hata.Message.ToString());      }

      finally      {      con.Close();      }

Her iki sql ifadeside tek bir hücreyi sonuç olarak döndürmektedir.

Page 592: C# Akademi 2005

606 (http://www.csharpnedir.com)

Command KavramıCommandType

CommandType Açıklaması

TextSql ifadelerini çalıştırmak için kullanılır. Bu aynı

zamanda Command sınıfına ait nesne örnekleri için varsayılan değerdir.

StoredProcedureVeri kaynağında yer alan bir Saklı Yordam

çalıştırılmak istendiğinde, CommandType değerine StoredProcedure verilir.

TableDirect

CommandType özelliğine bu değer atandığında, CommandText özelliği tablo adını alır. Komut çalıştırıldığında çalışan sql ifadesi "Select * From tabloadi" ifadesidir. Böylece belirtilen tablodaki tüm kayıtlar döndürülmüş olur.

Page 593: C# Akademi 2005

607 (http://www.csharpnedir.com)

Command KavramıOleDbCommand cmd=new OleDbCommand("Makale",con);

cmd.CommandType=CommandType.TableDirect;

      try

      {

      con.Open();

     

      OleDbDataReader dr;

      dr=cmd.ExecuteReader();

      while(dr.Read())

      {

        Console.WriteLine(dr["Konu"].ToString());

      }

      dr.Close();

      }

      catch(Exception hata) {Console.WriteLine(hata.Message.ToString());}

      finally      {      con.Close();      }

DataReader ile veri kümesinin okunması

Tablo Adı

Page 594: C# Akademi 2005

608 (http://www.csharpnedir.com)

Command Kavramı

?

OleDbCommand cmd=new OleDbCommand("Site Adlari",con);

Page 595: C# Akademi 2005

609 (http://www.csharpnedir.com)

Command Kavramı CommandType özelliğinin diğer değeri ise StoredProcedure'

dür. Veri kaynağındaki saklı yordamlarının çağırılması için kullanılmaktadır.

CREATE PROCEDURE dbo.MakaleBul(

@MakaleID int)ASSELECT * FROM Makale Where ID=@MakaleIDRETURN

Stored Procedure( Saklı Yordam )

Page 596: C# Akademi 2005

610 (http://www.csharpnedir.com)

Command KavramıOleDbCommand cmd=new OleDbCommand("MakaleBul",con);

      cmd.CommandType=CommandType.StoredProcedure;

      cmd.Parameters.Add("@MakaleID",OleDbType.Integer);

      cmd.Parameters["@MakaleID"].Value=41;

      try

      {      con.Open();

      OleDbDataReader dr;

      dr=cmd.ExecuteReader();

      while(dr.Read())

      {

        Console.WriteLine(dr["ID"].ToString()+"-"+dr["Konu"].ToString()+"-"+dr["Tarih"].ToString());

      }

      dr.Close();

      }

      catch(Exception hata)      {Console.WriteLine(hata.Message.ToString());}

      finally      {      con.Close();      }

Saklı Yordam Adı

Saklı Yordamdaki Parametre Ekleniyor

Saklı Yordamdaki Parametre Değeri Veriliyor

Page 597: C# Akademi 2005

611 (http://www.csharpnedir.com)

DataReader Veri kaynağından, programa doğru ileri yönlü ve

yanlız okunabilir bir akım(stream) sağlar. Bu akım ile veri kaynağındaki verilerin sıralı bir

şekilde okunması sağlanır. Herhangibir anda bellekte sadece bir veri satırına

erişebilir. Bağlantının çalışması boyunca açık olmasını

gerektirir. Listeleme amacı güden, küçük boyutlarda olan veri

kümeleri için tasarlanmıştır.

Page 598: C# Akademi 2005

612 (http://www.csharpnedir.com)

DataReader

Page 599: C# Akademi 2005

613 (http://www.csharpnedir.com)

DataReader DataReader sınıfı herhangibir yapıcı metoda

sahip değildir. Yani bir DataReader nesnesini bir new metodu ile

oluşturamayız. Sadece bir DataReader nesnesi tanımlayabiliriz.

Page 600: C# Akademi 2005

614 (http://www.csharpnedir.com)

DataReaderSqlCommand cmdKategori=new SqlCommand("Select distinct Kategori

From Kitaplar Order By Kategori",conFriends);

          SqlDataReader drKategori;

          drKategori=cmdKategori . ExecuteReader

(CommandBehavior.CloseConnection);          

          while(drKategori.Read())

          {

               lstKategori.Items.Add(drKategori.GetString(0));

          }

          drKategori.Close();

DataReader nesnesi tanımlanıyor.

Akım başlatılıyor.

DataReader kapatıldığında, Connection nesneside otomatik olarak kapatılacak.

0 indisli satırın değeri alınıyor.

Page 601: C# Akademi 2005

615 (http://www.csharpnedir.com)

DataReaderCommandBehavior Numaralandırıcısı

Page 602: C# Akademi 2005

616 (http://www.csharpnedir.com)

DataReaderCommandBehavior Değeri İşlevi

CommandBehavior.CloseConnection

DataReader nesnesi Close metodu ile kapatıldığında, ,ilişkili Connection nesneside otomatik olarak kapatılır. Nitekim, işimiz bittiğinde Connection nesnesinin açık unutulması sistem kaynaklarının gereksiz yere harcanmasına neden olur.

CommandBehavior.SingleRow

En çok kullanılan parametrelerden birisidir. Eğer  sql sorgumuz tek bir satır döndürecek tipte ise bu davranışı kullanmak performansı olumlu yönde etkiler. Örneğin PrimaryKey üzerinden yapılan sorgular. ( “Select * From Tablo Where ID=3” tarzında.)

Page 603: C# Akademi 2005

617 (http://www.csharpnedir.com)

DataReaderCommandBehavior Değeri İşlevi

CommandBehavior.SingleResult

Tek bir değer döndürecek tipteki sorgular için kullanılır. Örneğin belli bir alandaki sayısal değerlerin toplamı veya tablodaki kayıt sayısını veren sorgular gibi. Bu tekniğe alternatif olan ve daha çok tercih edilen bir diğer yöntem, SqlCommand nesnesinin ExecuteScalar metodudur

CommandBehavior.SchemaOnlyÇalıştırılan sorgu sonucu elde edilen

satırın(satırların) sadece alan bilgisini döndürür.

Page 604: C# Akademi 2005

618 (http://www.csharpnedir.com)

DataReaderCommandBehavior Değeri İşlevi

CommandBehavior.SequentialAccess

Bazı durumlarda tablo alanları çok büyük boyutlu binary tipte veriler içerebilirler. Bu tarz büyük verilerinin okunması için en kolay yol bunları birer akım (stream) halinde belleğe okumak ve oradan ilgili nesnelere taşımaktır. SequnetialAccess davranışı bu tarz akımların işlenmesine imkan tanırken performansıda arttırmaktadır.

CommandBehavior.KeyInfoBu durumda sql sorgusu sonucunda

SqlDataReader nesnesi, tabloya ait anahtar alan bilgisini içerir.

Page 605: C# Akademi 2005

619 (http://www.csharpnedir.com)

DataReader

SqlConnection conFriends=new SqlConnection("data

source=localhost;integrated security=sspi;initial catalog=Friends");

SqlCommand cmd=new SqlCommand("Select * From Kitaplar Where

ID=18",conFriends);

               SqlDataReader dr;

               conFriends.Open(); 

               dr=cmd.ExecuteReader(CommandBehavior.SingleRow);

               dr.Read();

               for(int i=0 ; i<dr . FieldCount ; ++i) {

                    Console.WriteLine(dr.GetName(i).ToString()+"="+dr[i].ToString());

               }

               dr.Close();

               conFriends.Close(); 

Elde edilen satır okunuyor.

?

Page 606: C# Akademi 2005

620 (http://www.csharpnedir.com)

DataReaderSqlConnection conNorthwind=new SqlConnection("data

source=localhost;integrated security=sspi;initial catalog=Northwind");

               SqlCommand cmd=new SqlCommand("Select

SUM(UnitPrice)/Count(UnitPrice)As [Ortalama Birim Fiyatı] From

Products",conNorthwind);

               SqlDataReader dr;

               conNorthwind.Open(); 

               dr=cmd.ExecuteReader(CommandBehavior.SingleResult);

               dr.Read(); 

               Console.WriteLine(dr.GetName(0).ToString()+"="+dr[0].ToString()); 

               dr.Close();

               conNorthwind.Close();

Tek hücrelik değer döndürür.

Page 607: C# Akademi 2005

621 (http://www.csharpnedir.com)

SqlConnection conNorthwind=new SqlConnection("data

source=localhost;integrated security=sspi;initial catalog=Northwind");

               SqlCommand cmd=new SqlCommand("Select * From

Products",conNorthwind);

               SqlDataReader dr;

               conNorthwind.Open(); 

               dr=cmd.ExecuteReader(CommandBehavior.SchemaOnly);

               dr.Read();

               try

               {

                    for(int i=0;i<dr.FieldCount;++i)

                    {

                         Console.WriteLine(dr.GetName(i).ToString()+" "+

dr.GetFieldType(i).ToString()+" "+dr[i].ToString());

                    }

               ...

?

Sadece şema bilgilerini döndürür.

DataReader

Page 608: C# Akademi 2005

622 (http://www.csharpnedir.com)

DataReaderSqlConnection conNorthwind=new SqlConnection("data

source=localhost;integrated security=sspi;initial catalog=Northwind");

               SqlCommand cmd=new SqlCommand("Select * From

Products",conNorthwind);

               SqlDataReader dr;

               conNorthwind.Open(); 

               dr=cmd.ExecuteReader(CommandBehavior.SchemaOnly);

               dr.Read();

               try

               {

                    for(int i=0;i<dr.FieldCount;++i)

                    {

                         Console.WriteLine(dr.GetName(i).ToString()+"

"+dr.GetFieldType(i).ToString());

                    }

               ...

Sadece şema bilgilerini döndürür.

Page 609: C# Akademi 2005

623 (http://www.csharpnedir.com)

DataReaderSqlConnection conPubs=new SqlConnection("data source=localhost;integrated security=sspi;initial catalog=pubs");               SqlCommand cmd=new SqlCommand("Select pr_info From pub_info where pub_id=0736",conPubs);               SqlDataReader dr;               conPubs.Open();                dr=cmd.ExecuteReader(CommandBehavior.SequentialAccess);                dr.Read();               try               {                     char[] dizi=new char[130];                     dr.GetChars(0,0,dizi,0,130);                    

for(int i=0;i<dizi.Length;++i)                     {    Console.Write(dizi[i]);    }                    Console.WriteLine();               }               ...

GetChars metodunu kullanarak alan içindeki veriyi karakter karakter okuyor ve beleğe doğru bir akım (stream) oluşturuyoruz.

Text tipinden veri

Page 610: C# Akademi 2005

624 (http://www.csharpnedir.com)

DataReader Kavramı

Veritabanından okuduğu verileri, SqlDataReader nesnesi ile okunduğu ve bir nesneler dizisine aktarıldığı bir uygulama yazın.

Page 611: C# Akademi 2005

625 (http://www.csharpnedir.com)

DataAdapter Kavramı DataAdapter sınıfları, sahip oldukları veri sağlayıcılarının

izin verdiği veri kaynakları ile, sistem belleği üzerinde yer alan bağlantısız katman nesneleri arasındaki veri alışverişinin kolay, güçlü ve verimli bir şekilde sağlanmasından sorumludurlar.

Veri kaynağından verilerin alınıp, bağlantısız katman nesneleri olan DataSet ve DataTable nesnelerine doldurulmasında ve bağlantısız katman nesnelerinin taşıdığı verilerdeki değişikliklerinde veri kaynağına yansıtılmasında kullanılırlar.

Page 612: C# Akademi 2005

626 (http://www.csharpnedir.com)

DataAdapter Kavramı

Page 613: C# Akademi 2005

627 (http://www.csharpnedir.com)

DataAdapter Kavramı

Page 614: C# Akademi 2005

628 (http://www.csharpnedir.com)

DataAdapter Kavramı Her DataAdapter sınıfı mutlaka bir SelectCommand sorgusu

içermek zorundadır. Bir DataSet(DataTable) içerisinde yapılan değişikliklerin veri

kaynağına tekrardan aktarılması için, yapılan değişikliğin çeşidine uygun komutların DataAdapter tarafından oluşturulması gerekmektedir.

Page 615: C# Akademi 2005

629 (http://www.csharpnedir.com)

DataAdapter KavramıYapıcı Metod Prototipi Açıklaması

public OleDbDataAdapter(string, string);Select sorgusunu ve bağlantı için gerekli

söz dizimini metin şeklinde parametre olarak alır.

public OleDbDataAdapter(string, OleDbConnection);

Sorguyu metin bazında alırken, bağlantı için önceden oluşturulmuş bir OleDbConnection nesnesini parametre olarak alır.

public OleDbDataAdapter(OleDbCommand);Select sorgusunu ve geçerli bir bağlantıyı

işaret eden bir OleDbCommand nesnesini parametre olarak alır.

public OleDbDataAdapter();

Böyle oluşturulan bir OleDbDataAdapter'ı kullanabilmek için, ilgili özellikler ( SelectCommand gibi.) sonradan ayarlanır.

Page 616: C# Akademi 2005

630 (http://www.csharpnedir.com)

DataAdapter Kavramı

OleDbConnection conFriends=new OleDbConnection (“

Provider=SQLOLEDB;Data Source=localhost;initial catalog=Friends;integrated

security=SSPI“ );

string sqlIfadesi="Select * From Makale";

OleDbDataAdapter daFriends=new OleDbDataAdapter(sqlIfadesi,conFriends);

DataSet ds=new DataSet();

daFriends.Fill(ds);

dgMakale.DataSource=ds;

Select Komutu için sql sorgusunu taşıyan string ifade

Bağlantı nesnesiSelect sorgusuna göre, DataSet’i doldurur.

Page 617: C# Akademi 2005

631 (http://www.csharpnedir.com)

DataAdapter Kavramı DataAdapter nesnesinin Fill metodunu çağırdığımızda,

nesne, parametre olarak aldığı bağlantıyı otomatik olarak açmaktadır. Yani Fill metodunu çağırmadan önce bağlantı nesnemizi Open metodu ile açmamıza gerek yoktur.

Page 618: C# Akademi 2005

632 (http://www.csharpnedir.com)

DataAdapter KavramıOleDbConnection conFriends=new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;initial catalog=Friends;integrated security=SSPI");

string sqlIfadesi1="Select * From Makale";string sqlIfadesi2="Select * From Kitap";

OleDbDataAdapter daMakale=new OleDbDataAdapter(sqlIfadesi1,conFriends);OleDbDataAdapter daKitap=new OleDbDataAdapter(sqlIfadesi2,conFriends);

DataSet ds=new DataSet();daMakale.Fill(ds);daKitap.Fill(ds);dgMakale.DataSource=ds;

? Üstüste iki Fill çağırımında Connection nesnesinin durumu ne olur.

Page 619: C# Akademi 2005

633 (http://www.csharpnedir.com)

DataAdapter KavramıconFriends.Open();

daMakale.Fill(ds);daKitap.Fill(ds);

dgMakale.DataSource=ds;

conFriends.Close();

Bağlantı açık olduğundan Fill metodunda açık olan bağlantı tekrardan açılmaz.

Page 620: C# Akademi 2005

634 (http://www.csharpnedir.com)

DataAdapter KavramıOleDbConnection conFriends=new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;initial catalog=Friends;integrated security=SSPI");

string sqlIfadesi1="Select * From Makale";string sqlIfadesi2="Select * From Kitap";

OleDbDataAdapter daMakale=new OleDbDataAdapter(sqlIfadesi1,conFriends);OleDbDataAdapter daKitap=new OleDbDataAdapter(sqlIfadesi2,conFriends);

DataSet ds=new DataSet();

conFriends.Open();

daMakale.Fill(ds,"Makaleler");daKitap.Fill(ds,"Kitaplar");

dgMakale.DataSource=ds;conFriends.Close();

Fill metodu veri kümesini DataSet’e Makaleler tablo adı ile aktarır.

Page 621: C# Akademi 2005

635 (http://www.csharpnedir.com)

DataAdapter KavramıOleDbConnection conFriends=new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;initial catalog=Friends;integrated security=SSPI");    string sqlIfadesi="Select * From Makale;Select * From Kitap;Select * From Kisiler"; OleDbDataAdapter da=new OleDbDataAdapter(sqlIfadesi,conFriends);

da.TableMappings.Add("Table","Makaleler");da.TableMappings.Add("Table1","Kitaplar");da.TableMappings.Add("Table2","Arkadaslarim");

DataSet ds=new DataSet();da.Fill(ds);dgMakale.DataSource=ds;

Table adlarının sırasıyla hangi tablo adına karşılık geleceği belirlenir.

Page 622: C# Akademi 2005

636 (http://www.csharpnedir.com)

DataAdapter Kavramı Çoğu zaman uygulamalarımızda sadece tek tabloyu

bağlantısız katmanda kullanmak isteyebiliriz. Böyle bir durumda bu tek tablo verisi için, DataSet nesnesi kullanmak sistem kaynaklarını daha çok harcamak anlamına gelir. Bunu çözmek için, veri kaynağından okunan verileri bir DataTable nesnesine aktarırız.

OleDbDataAdapter da=new OleDbDataAdapter(sqlIfadesi,conFriends);

DataTable dt=new DataTable("Makalelerim");

da.Fill(dt); DataTable nesnesi dolduruluyor.

Page 623: C# Akademi 2005

637 (http://www.csharpnedir.com)

DataAdapter Kavramı Fill metodunda dönüş değeri, DataAdapter nesnesinin

çalıştırdığı sorgu sonucu dönen satır sayısına işaret etmektedir.

OleDbConnection conFriends=new

OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;initial

catalog=Friends;integrated security=SSPI");

    string sqlIfadesi="Select * From Makale";

OleDbDataAdapter da=new

OleDbDataAdapter(sqlIfadesi,conFriends);

DataTable dt=new DataTable("Makalelerim");

int SatirSayisi=da.Fill(dt);

dgMakale.DataSource=dt;

dgMakale.CaptionText=dt.TableName.ToString();

MessageBox.Show("Makale Sayısı "+SatirSayisi.ToString());

Page 624: C# Akademi 2005

638 (http://www.csharpnedir.com)

DataAdapter Kavramı Belli bir satırdan itibaren belirli bir sayıda kaydın elde

edilmesini sağlayabiliriz.

da.Fill ( ds , 0 , 3 , "Son3Makale");

Select * From Makale Order By Tarih Desc

Başlangıç satırı.

Okunacak satır sayısı.

Tarihlere göre ters sırada sorgular

Page 625: C# Akademi 2005

639 (http://www.csharpnedir.com)

DataAdapter KavramıCREATE PROCEDURE MakalelerASSelect * From Makale RETURN

Bu saklı yordamı bir DataAdapter nesnesi yardımıyla çalıştırıp, sonuç kümesini bir DataTable nesnesine aktarabiliriz.

?

Page 626: C# Akademi 2005

640 (http://www.csharpnedir.com)

DataAdapter Kavramı DataAdapter nesnesinin Visual Studio.NET ortamında

otomatik olarak oluşturulması.

Page 627: C# Akademi 2005

641 (http://www.csharpnedir.com)

DataAdapter Kavramı Bağlantısız katman nesnelerinin temsil ettiği veriler üzerinde

yapılan değişiklikleri veritabanına göndermek için, Update metodu kullanılır.

DataAdapter nesnelerinin, verilerin güncellenmesi için UpdateCommand, verileri eklemek için InsertCommand, veri silmek için DeleteCommand özellikleri vardır.

Page 628: C# Akademi 2005

642 (http://www.csharpnedir.com)

DataAdapter Kavramı

DataRowState Değeri Açıklama

Added Yeni bir satır eklendiğini belirtir.

Deleted Bir satırın silindiğini belirtir.

Modified Bir satırın düzenlendiğini belirtir.

DetachedYeni bir satır oluşturulduğunu ama henüz ilgili

bağlantısız katman nesnesinin DataRow koleksiyonuna eklenmediğini belirtir.

Unchanged Satırda herhangibir değişiklik olmadığını belirtir.

Update metodu uygulandığında, DataAdapter nesnesi, parametre olarak belirtilen DataTable nesnesinin tüm satırlarında RowState değerine bakar.

Page 629: C# Akademi 2005

643 (http://www.csharpnedir.com)

DataAdapter Kavramı Added işaretli satırlar için, InsertCommand özelliğindeki sql

komutu, Deleted işaretli satırlar için DeleteCommand özelliğindeki sql

komutu, Modified işaretli satırlar için, UpdateCommand özelliğindeki

sql komutu çalışır.

Page 630: C# Akademi 2005

644 (http://www.csharpnedir.com)

DataAdapter Kavramı

da.InsertCommand=new OleDbCommand("INSERT INTO Kisiler

(Ad,Soyad,DogumTarihi,Meslek) VALUES (?,?,?,?)",con);

da.InsertCommand.Parameters.Add("prmAd",OleDbType.VarChar,50,"Ad");

da.InsertCommand.Parameters.Add("prmSoyad",OleDbType.VarChar,50,"Soyad");

da.InsertCommand.Parameters.Add("prmDogum",OleDbType.Date,8,"DogumTarihi");

da.InsertCommand.Parameters.Add("prmMeslek",OleDbType.VarChar,50,"Meslek");

Added işaretli kolonların veritabanına girilmesi için gerekli InsertCommand nesnesinin oluşturulması.

Page 631: C# Akademi 2005

645 (http://www.csharpnedir.com)

DataAdapter Kavramı

da.UpdateCommand=new OleDbCommand("UPDATE Kisiler SET

Ad=?,Soyad=?,DogumTarihi=?,Meslek=? WHERE KisiID=?",con);

da.UpdateCommand.Parameters.Add("prmKID",OleDbType.Integer,4,"KisiID");

da.UpdateCommand.Parameters.Add("prmSoyad",OleDbType.VarChar,50,"Soyad");

da.UpdateCommand.Parameters.Add("prmDogum",OleDbType.Date,8,"DogumTarihi");

da.UpdateCommand.Parameters.Add("prmMeslek",OleDbType.VarChar,50,"Meslek");

da.UpdateCommand.Parameters.Add("prmKisiID",OleDbType.Integer,4,"KisiID");

Modified işaretli kolonların veritabanına girilmesi için gerekli UpdateCommand nesnesinin oluşturulması.

Page 632: C# Akademi 2005

646 (http://www.csharpnedir.com)

DataAdapter Kavramı

da.DeleteCommand=new OleDbCommand("DELETE FROM Kisiler WHERE

KisiID=?",con);

da.DeleteCommand.Parameters.Add("prmKisiID",OleDbType.Integer,4,"KisiID");

Deleted işaretli kolonların veritabanına girilmesi için gerekli DeleteCommand nesnesinin oluşturulması.

DataAdapter için bu komutlar belirlendikten sonra hangi metod çağırılır??

Page 633: C# Akademi 2005

647 (http://www.csharpnedir.com)

DataAdapter Kavramı CommandBuilder ile zahmete girmeden, DataAdapter

için gerekli sql komutları oluşturulabilir.

OleDbCommandBuilder cb=new OleDbCommandBuilder(da);

Page 634: C# Akademi 2005

648 (http://www.csharpnedir.com)

DataAdapter Kavramı DataAdapter sınıfı aşağıdaki tabloda belirtilen üç önemli olayı içermektedir.

Olay Prototipi Açıklama

FillErrorpublic event

FillErrorEventHandler FillError;

OleDbDataAdapter'ın fill metodu kullanıldığında oluşabilecek bir hata durumunda bu olay çalışır.

RowUpdating

public event OleDbRowUpdatingEventHandler RowUpdating;

Update metodu çalıştırılarak, veritabanındaki tabloya yapılan değişiklikler (satır ekleme, satır silme, satır güncelleme gibi) gerçekleştirilemden önce bu olay çalışır.

RowUpdated

public event OleDbRowUpdatedEventHandler RowUpdated;

Veritabanında yapılacak olan değişiklikler, Update metodu ile gerçekleştirildikten sonra bu olay çalışır.

Page 635: C# Akademi 2005

649 (http://www.csharpnedir.com)

DataAdapter Kavramı

Page 636: C# Akademi 2005

650 (http://www.csharpnedir.com)

DataAdapter Kavramıda.RowUpdated+=new OleDbRowUpdatedEventHandler(RowUpdatedOlayi);

private void RowUpdatedOlayi(object sender,OleDbRowUpdatedEventArgs arg){    if(arg.StatementType==StatementType.Insert)    {        girilen+=arg.RecordsAffected;    }    else if (arg.StatementType==StatementType.Delete)    {        silinen+=arg.RecordsAffected;    }    else if (arg.StatementType==StatementType.Update)    {        guncellenen+=arg.RecordsAffected;    } }

Page 637: C# Akademi 2005

651 (http://www.csharpnedir.com)

DataTable DataTable sınıfından türetilen bir nesne, bir

tabloyu ve elemanlarını bellekte temsil etmek için kullanılmaktadır.

DataTable sınıfı bellekte temsil ettiği tablolara ait olan satırları Rows koleksiyonuna ait DataRow nesneleri ile temsil ederken,

Tablonun alanlarını ise, Columns koleksiyonuna ait DataColumn nesneleri ile temsil etmektedir.

Page 638: C# Akademi 2005

652 (http://www.csharpnedir.com)

DataTable

Page 639: C# Akademi 2005

653 (http://www.csharpnedir.com)

DataTableDataTable nesnesi ile bir tablo oluşturmak

Bir DataTable nesnesi oluşturup DataTable’ın bellekte temsil edeceği tablo için bir isim belirlenir.

Tablomuzun içereceği alanların isimleri, veri türleri belirlenerek birer DataRow nesnesi şeklinde, DataTable nesnesinin Columns koleksiyonuna eklenir.

Tablomuz için bir primary key alanı belirlenir.

Page 640: C# Akademi 2005

654 (http://www.csharpnedir.com)

DataTableDataTable dt=new DataTable ( txtTabloAdi.Text ) ;

DataColumn dc=new DataColumn();dt.Columns.Add(txtAlanAdi.Text,Type.GetType(System.Int32));

DataColumn dcID=new DataColumn(); dcID.ColumnName="ID";             cID.DataType=Type.GetType("System.Int32"); dcID.Unique=true; dcID.AutoIncrement=truedcID.AutoIncrementSeed=1;dcID.AutoIncrementStep=1; dt.Columns.Add(dcID); DataColumn[] anahtarlar=new DataColumn[1];anahtarlar[0]=dt.Columns["ID"];dt.PrimaryKey=anahtarlar;

DataTable oluşturuluyor.

Yeni bir alan oluşturuluyor.

Alan bilgileri belirleniyor.

Tablo için PrimaryKey alanı oluşturuluyor.

Page 641: C# Akademi 2005

655 (http://www.csharpnedir.com)

DataTable

DataRow dr;

dr=dt . NewRow();

dr[1] = “Burak Selim”;

dt.Rows.Add(dr);

DataTable nesnesine yeni bir veri satırı eklemek için DataRow nesnesi kullanılır.

DataRow nesnesi tanımlanıyor.

DataRow nesnesi DataTable’ın DataRows koleksiyonuna ekleniyor.

DataTable’daki 1 indisli alanı temsil ediyor.

Yeni satır DataTable’ın Rows koleksiyonuna ekleniyor.

Page 642: C# Akademi 2005

656 (http://www.csharpnedir.com)

DataSet

Page 643: C# Akademi 2005

657 (http://www.csharpnedir.com)

DataSet DataSet veri kaynağından bağımsız olarak

veriler üzerinde işlem yapmamızı sağlar, ve gerektiğinde DataAdapter yardımıyla DataSet üzerindeki verileri tekrar veri kaynağına aktarmamızı sağlar.

Bir DataSet ile, veri kaynağından bağlantı kesilse bile DataSet içindeki verilerle çalışabiliriz.

Bir DataSet içinde bir yada daha fazla tablo olabilir. Bu tablolar System.Data isim alanındaki DataTable sınıfı ile temsil edilir.

Tabloların yapısında ise kayıtları ve sütunları temsil eden DataRow ve DataColumn sınıfları mevcuttur.

Page 644: C# Akademi 2005

658 (http://www.csharpnedir.com)

DataSetOleDbDataAdapter adp = new  OleDbDataAdapter(sorgu,baglanti);DataSet ds = new DataSet();adp.Fill(ds, "Uyeler");

DataSet oluşturuluyor.

DataSet dolduruluyor.

Bu kodu tamamlayın. ?

Page 645: C# Akademi 2005

659 (http://www.csharpnedir.com)

DataSetforeach(DataColumn dc in ds.Tables["Uyeler"].Columns)

if (dc.Caption.Length > 10)Console.Write("{0,-10}",  dc.Caption.Substring(0,5) + "...");

elseConsole.Write("{0,-10}", dc.Caption);

Console.WriteLine();for(int i=0; i<65; ++i)

Console.Write("-");Console.WriteLine();

foreach(DataRow dr in ds.Tables["Uyeler"].Rows){

object[] dizi = dr.ItemArray;

foreach(object i in dizi)Console.Write("{0,-10}",i.ToString());

Console.WriteLine();}

? Bu kodu yorumlayın

Page 646: C# Akademi 2005

661 (http://www.csharpnedir.com)

DataRelation DataRelation sınıfına ait nesneler, aralarında ilişkisel bağ

olan tablolarının, aralarındaki ilişkiyi temsil ederler. Bir DataRelation nesnesi kullandığımızda, bu nesneyi

mutlaka bir DataSet sınıfı nesnesine eklememiz gerekmektedir.

Page 647: C# Akademi 2005

662 (http://www.csharpnedir.com)

DataRelation

Page 648: C# Akademi 2005

663 (http://www.csharpnedir.com)

DataRelation

SqlConnection conFriends=new SqlConnection("data source=localhost;initial catalog=Friends;integrated security=sspi");      SqlDataAdapter daSiparis=new SqlDataAdapter("Select * From Siparis",conFriends);SqlDataAdapter daSepet=new SqlDataAdapter("Select * From Sepet",conFriends); DataTable dtSiparis=new DataTable("Siparisler");DataTable dtSepet=new DataTable("SiparisDetaylari"); daSiparis.Fill(dtSiparis);daSepet.Fill(dtSepet);    DataRelation drSiparisToSepet=new DataRelation("Siparis_To_Sepet",dtSiparis.Columns["SiparisID"],dtSepet.Columns["SiparisID"]);     DataSet ds=new DataSet();ds.Tables.Add(dtSiparis);ds.Tables.Add(dtSepet);ds.Relations.Add(drSiparisToSepet);dataGrid1.DataSource=ds.Tables["Siparisler"];

DataRelation nesnesi oluşturuluyor

DataSet’in Relations koleksiyonuna ekleniyor.

Page 649: C# Akademi 2005

664 (http://www.csharpnedir.com)

DataRelation ForeignKeyConstraint (Yabancı anahtar kısıtlaması)

DeleteRule

UpdateRule

AcceptRejectRule

Rule.Cascade

Rule.None

Rule.SetDefault

Rule.SetNull

Kurallar Kural Değeleri

Page 650: C# Akademi 2005

665 (http://www.csharpnedir.com)

DataRelation Cascade değeri verildiğinde güncelleme ve silme

işlemlerinden, child tablodaki kayıtlarında etkilenmesi sağlanmış olunur. Parent tabloda bir satırın silinmesi ile ilişkili tablodaki ilişkili satırlarında tümü silinir.

None değeri verildiğinde değişiklikler sonunda child tabloda hiç bir değişiklik olmaz.

SetDefault değeri, silme veya güncelleme işlemleri sonucunda child tablodaki ilişkili satırların alanlarının değerlerini varsayılan değerlerine ( çoğunlukla veritabanında belirlenen ) ayarlar.

SetNull verildiğinde child tablodaki ilişkili satırlardaki alanların değerleri, DbNull olarak ayarlanır. 

Page 651: C# Akademi 2005

666 (http://www.csharpnedir.com)

DataRelationfkSiparisToSepet=new ForeignKeyConstraint

("fkS_S",dtSiparis.Columns["SiparisID"],dtSepet.Columns["SiparisID"]);

fkSiparisToSepet.DeleteRule=Rule.Cascade;

fkSiparisToSepet.UpdateRule=Rule.Cascade

fkSiparisToSepet.AcceptRejectRule=AcceptRejectRule.Cascade

ds=new DataSet();

ds.Tables.Add(dtSiparis);

ds.Tables.Add(dtSepet);

ds.Tables["SiparisDetaylari"].Constraints.Add(fkSiparisToSepet);

ds.EnforceConstraints=true;

dataGrid1.DataSource=ds;

Page 652: C# Akademi 2005

667 (http://www.csharpnedir.com)

Transaction

Page 653: C# Akademi 2005

668 (http://www.csharpnedir.com)

TransactionSqlTransaction tr; conIstanbulMerkez.Open();tr=conIstanbulMerkez.BeginTransaction(); SqlCommand cmdPrimToplamiArttir=new SqlCommand("Prim Toplami

Arttir",conIstanbulMerkez);...cmdPrimToplamiArttir.Transaction=tr; SqlCommand cmdPrimBilgisiGir=new SqlCommand("Prim Bilgisi

Gir",conIstanbulMerkez);...cmdPrimBilgisiGir.Transaction=tr; try {          int etkilenen=cmdPrimToplamiArttir.ExecuteNonQuery();         int eklenen=cmdPrimBilgisiGir.ExecuteNonQuery();         tr.Commit();}catch(Exception hata)   {   tr.Rollback();  } finally {    conIstanbulMerkez.Close();   }

Transaction Nesnesi Oluşturuluyor

Transaction Başlatılıyor

İşlemler Onaylanıyor

İşlemler İptal Ediliyor

Page 654: C# Akademi 2005

669 (http://www.csharpnedir.com)

XML İşlemleri Framework’ün konfigürasyon dosyalarının çoğu XML

tabanlıdır. ADO.NET gibi büyük bir kütüphane XML ile içi içe

çalışmaktadır. Farklı sistemler arasında haberleşmeyi sağlayan Web

Servisleri, HTTP üzerinden, XML yardımıyla bir sunucudaki metodu çalıştırıp metodun geri dönüş değerini aradaki çeşitli katmanları kullanarak XML formatında geri döndürür.

XML belgeleri , biçimlendirilmiş text tabanlı veri depolama işine yarayan belgelerdir.

Page 655: C# Akademi 2005

670 (http://www.csharpnedir.com)

<?xml version="1.0" encoding = "ISO-8859-9"?><yemekler>

<menu adı="Sultan Sofrası"><corba>Mercimek</corba><ana_yemek>Döner</ana_yemek><tatlı>Kadayıf</tatlı>

</menu>

<menu adı="Çilingir Sofrası"><corba>Domates Çobası</corba><ana_yemek>Balık</ana_yemek><tatlı>Lokma</tatlı>

</menu></yemekler>

XML İşlemleriEn Sade Haliyle Bir XML Belgesi

menu adı çorba ana_yemek tatlıTablo Karşılığı

Yemekler

Page 656: C# Akademi 2005

671 (http://www.csharpnedir.com)

XML İşlemleriSystem.XML NameSpace

XML belgeleri üzerinde işlem yapmak için geliştirilmiş sınıflar System.XML isim alanında bulunur.

XmlReader XML belgelerinden verileri okumamız için tasarlanmış bir sınıftır. Tamponlama mekanizması ile çalışmamaktadır. Yani veriler direkt dosya sisteminden alnır. (Sadece ileri yönlü bir okuma yapılabilir.)

XmlWriter Bir akıma yada dosya sistemine XML verilerini kaydetmek için kullanılır. (Sadece iler yönlü bir okuma yapılabilir.)

XmlTextReader XML belgelerinden sadece ileri yönde okuma yapar ve XML verilerine bir akım(stream) gibi erişmemizi sağlar.

XmlTextWriter XML akımlarını dosya sisteminde oluşturmak için kullanılır.

Page 657: C# Akademi 2005

672 (http://www.csharpnedir.com)

XML İşlemleriSystem.XML NameSpace

XML belgeleri üzerinde işlem yapmak için geliştirilmiş sınıflar System.XML isim alanında bulunur.

XmlNode XML belgesindeki tek bir düğümü temsil etmek için kullanılır.

XmlNodeReader Okumak için bir düğüm bilgisini kaynak olarak kullanır.

XmlDocument Bir XML belgesinin belleğe bir ağaç yapısı şeklinde yüklenmesini ve bu ağaç üzerinde çeşitli işlemler yapılabilmesini sağlar.

Page 658: C# Akademi 2005

673 (http://www.csharpnedir.com)

XML İşlemleri

XmlTextReader(string dosya_yolu) :

string dosya = “yemekler.xml“;XmlTextReader = new XmlTextReader(dosya);

XmlTextReader(Stream akım) :

string dosya = “yemekler.xml“;FileStream fs = new FileStream(dosya, FileMode.Open) XmlTextReader = new XmlTextReader(fs);

XmlTextReader(XmlTextReader text_reader) :

XmlTextReaderBu yapıcı metot ile parametrede belirtilen XML belgesine ilişkin bir nesne oluşturulur.

Oluşturulan nesne, parametre ile belirlenen Stream türünden bir nesneye ilişkindir. Stream nesnesi bir FileStream olabileceği gibi NetworkStream de olabilir.

Bu yapıcı metot ile XmlTextReader nesnesine ilişkin yeni bir nesne oluşturulur.

Page 659: C# Akademi 2005

674 (http://www.csharpnedir.com)

XML İşlemleriXmlTextReader xtr = new XmlTextReader("yemekler.xml");while(xtr.Read()){

if(xtr.NodeType == XmlNodeType.Element){

Console.Write("{0,-10}",xtr.Name);if(xtr.HasAttributes){

Console.Write("\t{0} niteliği  var, ",xtr.AttributeCount);while(xtr.MoveToNextAttribute())

Console.Write("{0} = {1}",xtr.Name,xtr.Value);Console.WriteLine();

}else

Console.WriteLine("\tNitelik yok...");}

} XmlTextReader sınıfının Name özelliği ilgili düğümün etitket ismini, Value özelliği ise ilgili düğümün değerini vermektedir.

Nesne oluşturuluyor.

Node tipi element mi?

Node’un sahip olduğu nitelikler varmı?

Page 660: C# Akademi 2005

675 (http://www.csharpnedir.com)

XML İşlemleri

Page 661: C# Akademi 2005

676 (http://www.csharpnedir.com)

XML İşlemleri XmlTextReader sınıfının NodeType özelliği System.Xml isim alanında

bulunan XmlNodeType numaralandırıcısı türündendir.

Attribute CDATA None

Document DocumentFragment EndEntity

Element EndElement Comment

Entity EntityReference XmlDecleration

Notation ProcessingInstruction SignificantWhitespace

Text DocumentType Whitespace

Page 662: C# Akademi 2005

677 (http://www.csharpnedir.com)

XML İşlemleri-DOM Modeli XmlDocument ile bir XML belgesi tamamen belleğe yüklenir ve

bir DataSet gibi üzerinde işlemler yapılıp tekrar XML belgesine güncelleme yapılır.

XmlDocument ile XML belgesi belleğe bir ağaç yapısı şeklinde yüklendiği için çeşitli sınıflar yardımıyla her bir düğüm elde edilip üzerinde çeşitli işlemler yapılabilir.

XmlDocument ile çalışırken sıkça kullanacağımız iki sınıf daha vardır. Bunlar XmlElement ve XmlAttribute sınıflarıdır. Bu sınıflar sırasıyla bir eleman ve nitelik temsil etmek için kullanılır.

Page 663: C# Akademi 2005

678 (http://www.csharpnedir.com)

XML İşlemleri-DOM Modeli XmlDocument nesnesine XML belgesini yüklememiz için

XmlTextReader sınıfına ihtiyacımız var.

XmlTextReader xr = new XmlTextReader("yeni.xml");

XmlDocument xd = new XmlDocument();

xd.Load(xr);

Page 664: C# Akademi 2005

679 (http://www.csharpnedir.com)

XML İşlemleri-DOM ModeliXmlNodeList xnl = doc.ChildNodes;

Console.WriteLine("Toplam yavru düğüm: " + xnl.Count);

foreach(XmlNode xn in xnl)

Console.WriteLine("Yavru düğüm adı:{0}, türü:{1}",xn.Name,xn.NodeType);

Console.WriteLine("\n");

XmlElement xe = doc.DocumentElement;

if(xe.HasChildNodes)

{

Console.WriteLine("İlk yavru düğüm:{0}",xe.FirstChild.Name);

}

XmlNodeList xnl2 = xe.FirstChild.ChildNodes;

foreach(XmlNode xn in xnl2)

Console.WriteLine("Yavru düğüm adı:{0},                                      

Page 665: C# Akademi 2005

680 (http://www.csharpnedir.com)

SON