C# Akademi 2005

Preview:

Citation preview

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

.NET Framework ve C#’a Giriş

C# Akademi

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

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

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

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 ?

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

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ığı

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

.NET Framework Bileşenleri

İki ana bileşen

FCL – Framework Class Library

CLR – Common Language Runtime

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ı

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

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

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

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

...

...

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-)

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

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!

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

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

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.

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

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ı

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”

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

Assembly Yükleme

Strongly Named Assemblies (Public Assembly)(GAC Kurulumu)

Private Assemblies (XCOPY Kurulum)

Tek farkı kurulumla ilgilidir.

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

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

Private Assemblies

Tekil ID yok Uygulama dizininde

bulunur XCOPY kurulumu

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

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

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

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

...

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

Merhaba Dünya

Class ilk_program1{

static void Main(){

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

}

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

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

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

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 “ );

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

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.

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

Bellek Alanları

Stack

Heap

Ram Olmayan Bölge

Constant

Register

Static

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;

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.

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;

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.

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;

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;

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.

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;

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.

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.

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

Değer ve Referans Türleri

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.

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

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

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ü

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

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;

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’

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

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.

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.

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.

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.

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.

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.

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.

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.

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

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 =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

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;

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=?

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

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

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

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

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

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

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

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.

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

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

&

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.

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

|

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.

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

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.

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.

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

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

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);

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)

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

Deyim ve İfade

Deyim(statement) Örneği

a = (a << b) + c;

İfade(expression) Örneği

a = (a << b) + c

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

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

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ı

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}

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?

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.

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.

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ış");

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ü

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ı ?

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;}

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 !

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.

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ı

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.

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.

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

for döngüsü Animasyonu

donguler_flash_for.swf

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;

}

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

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

for (;;)

{

Console.WriteLine(k);

++k;

}

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.

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ı !

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;

}

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ı !

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

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.

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.

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

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

Atlama deyimi ile ilgili örnekler.

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.

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.

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?

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;

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?

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

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

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

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

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

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

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.

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

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?

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)

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ı

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.

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.

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 );

}

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

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

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

static void Yaz(int a,int b){

return a+b;}

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

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

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

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

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

static void Yaz(int a,int b){

int a;}

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

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

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

Metodlar

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.

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);

}

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

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.

?

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

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

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.

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

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.

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ı;

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.

?

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 ){...}

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.

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

Özyinelemeli (Recursive) Metodlar

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

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

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.

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 ){...}

}

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.

?

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.

?

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

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()+" ");}

}

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.

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.

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ı

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.

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.

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

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

Stack Heap

@

@

hesap1

hesap2 HesapNo

Limit

Kart Sahibi

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

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

Stack Heap

@

@

hesap1

hesap2 HesapNo

Limit

Kart Sahibi

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

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ı

?

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.

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.

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.

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.

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

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.

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.

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

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.

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.

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

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

Yapıcı Metodlar

?

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);

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 ){}...

}

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

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

Yapıcı Metodlar

?

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.

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 ?

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.

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");}

}

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.

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.

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.

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?

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?

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ı

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?

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.

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?

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.

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

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

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

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();

}

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.

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 ?

?

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.

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;

}

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.

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.

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.

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.

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.

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

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.

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ı.

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.

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 ]{

...}

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;}

}

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.

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

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.

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”

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)

?

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?

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.

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.

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

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.

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.

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ı

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.

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

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.

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);

}}

}

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

İsim Alanları (Namespace)Grafik2D

Grafik3DNokta

Nokta

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.

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.

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??

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");}

}}

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

Using Anahtar Sözcüğü

class Class1{

static void Main(string[] args){

Nokta n=new Nokta();}

}

?

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();}

}}

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;

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.

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.

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

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);

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);

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ı

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

BitConverter SınıfıIsLittleEndian Özelliği

true false

Most Significant Byte Least Significant Byte

Little EndianBig Endian

INTEL

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+" ");

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.

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.

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??

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.

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.

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();

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.

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

Dosya ve Klasör İşlemleri

Directory Class

File Class

Path Class

FileInfo Class

DirectoryInfo Class

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.

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.

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.

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.

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.

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.

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.

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.

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.

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));

}

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.

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.

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

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.

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.

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

DirectoryInfo Bir dizin ile ilgili bilgileri elde etmek için

kullanılır.

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.

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.

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

FileInfo Sınıfı Tek bir dosya ile ilgili özellikleri içerir.

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

Path Sınıfı String olarak aldığı bir yol bilgisi üzerinde

çeşitli işlemler yapan static üyelere sahiptir.

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.

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.

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.

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.

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.

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);}

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.

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??

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.

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.

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.

?

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.

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.

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.

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);

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.

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);

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.

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();

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.

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();

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.

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();

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.

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.

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');

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.

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.

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.

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.

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.

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);

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);

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.

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.

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

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.

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);

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);

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);

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.

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);

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.

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.

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.

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)

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.

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.

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)

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#.

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); }

}}

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

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.

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.

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

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

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

Kalıtım (Inheritance)

Memeli m=new Memeli();

m.Boy=10;

m.Kilo=5;

m.OzellikGoster();

m.TurGoster();

?

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?

?

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.

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.

?

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?

?

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.

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.

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;

}}

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??

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.

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.

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;

}}

}

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;

}}

}

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

İsim Saklama ( Name Hiding)public class Program{

static void Main(){

Y y=new Y(5);

int deneme=y.A;}

}

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;

}}

}

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); }

}}

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.

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,

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.

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.

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");

}}

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;}

}

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.

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.

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)

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.

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.

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.

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'

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

Özet(Abstract) Sınıflar

Özet Sınıfların yapıcı metodlarını nasıl kullanabiliriz.

?

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.

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.

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

Özet(Abstract) Sınıflar

Özet özellikler bildirilebilir mi?

?

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??

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

Örnek

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

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.

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.

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.

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

Arayüzler (Interfaces)interface IArayuz{

int BirSonraki();int BirOnceki();

int Deger{

get;set;

}

int this[int indis]{

get;}

}

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.

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.

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.

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{...}

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.

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.

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.

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.

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.

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.

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?

?

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

İstisnai Durum Yönetimi (Exception Handling)

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?

?

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.

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??

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ı.

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.

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.

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.

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ı...");}

}

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.

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;}}

}

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.

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.

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.

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.

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.

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!”);}

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!”);}

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

İstisnai Durum Yönetimi (Exception Handling)

catch{...}catch(Exception excp){...}

Hangi catch bloğu çalıştırılır.

?

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.

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.

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.

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.

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.

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.

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.

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.

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ı

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

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.

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.

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.

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.

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.

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.

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.

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

Temsilciler (Delegate)Uygulama

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);

}

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.

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);}

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.

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

Çoklu Temsilciler (Multicast Delegates)

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.

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.

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.

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.

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ı

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.

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.

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

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.

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.

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.

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.

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.

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.

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.

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);

}}

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.

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.

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.

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)

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);}

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();}

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.

?

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.

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.

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?

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?

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");

}

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.

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?

?

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){}

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.

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!");}

}

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

Niteliklerclass Nitelikler{

static void Main(){

Deneme den = new Deneme();den.English();den.Turkce();

}}

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);}

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.

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.

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

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.

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.

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(){}

}

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.

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;}

}}

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")]

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.

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

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.

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{

}

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    {

    }}

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){

}

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;}

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.

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.

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.

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

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.

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

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;

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;

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);

}

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.

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.

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.

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);

}

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.

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.

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.

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

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.

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.

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.

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.

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;

}

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]);

}}

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;

}}

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);

}

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.

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.

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.

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.

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.

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.

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.

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.

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.

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();}

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.

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

ArrayList Sınıfıclass Deneme{

int x;public Deneme(int x){

this.x = x;}

}

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?

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??

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)

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.

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.

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.

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.

?

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.

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.

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.

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.

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.

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.

!

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.

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.

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);

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.

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.

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ı?

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.

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.

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.

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ı.

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.

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.

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.

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());

}

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.

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)

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.

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.

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? ?

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.

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.

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.

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

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

COM Nesnelerinin Kullanımı

Tlbimp /namespace:CsNedir /out:COM_RCW /verbose VbCOM.dll

Register Edilmiş Olmalı(regsvr32.exe)

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

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

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.

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;    }

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;        }    }}

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

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

Adımlar – 3 : Register EdiyoruzAdımlar – 3 : Register Ediyoruz

regasm.exe Toplama.dll

Types registered successfully

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>

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

Adımlar – 5 : SonuçAdımlar – 5 : Sonuç

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()

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()

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();

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

Soket Tabanlı ProgramlamaSoket Tabanlı Programlama

TcpListenerSocket

NetworkStreamTcpClient

Kullanılan Sınıflar

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.

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.

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.

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

ADO.NET Nesne Modeli

Connection

Transaction

DataAdapter

Command

Parameter

DataReader

Connected(Bağlantılı)Nesneler

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

ADO.NET Nesne Modeli

DataSet

DataTable

DataRow

DataColumn

Constraint

DataRelation

DataView

Disconnected(Bağlantısız)

Nesneler

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

ADO.NET Nesne Modeli

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.

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

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.

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.

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.

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.

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

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

Connection ( Bağlantı )OleDbConnection

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());

}

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.

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.

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.

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.

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.

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

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

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.

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();      }

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.

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.

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.

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.

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ı

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

Command Kavramı

?

OleDbCommand cmd=new OleDbCommand("Site Adlari",con);

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 )

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

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.

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

DataReader

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.

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.

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

DataReaderCommandBehavior Numaralandırıcısı

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.)

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.

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.

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.

?

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.

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

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.

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

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.

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.

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

DataAdapter Kavramı

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

DataAdapter Kavramı

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.

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.

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.

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.

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.

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.

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.

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.

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.

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());

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

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.

?

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

DataAdapter Kavramı DataAdapter nesnesinin Visual Studio.NET ortamında

otomatik olarak oluşturulması.

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.

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.

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.

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ı.

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ı.

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??

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

DataAdapter Kavramı CommandBuilder ile zahmete girmeden, DataAdapter

için gerekli sql komutları oluşturulabilir.

OleDbCommandBuilder cb=new OleDbCommandBuilder(da);

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.

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

DataAdapter Kavramı

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;    } }

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.

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

DataTable

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.

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.

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.

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

DataSet

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.

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. ?

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

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.

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

DataRelation

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.

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

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. 

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;

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

Transaction

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

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.

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

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.

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.

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.

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ı?

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

XML İşlemleri

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

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.

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);

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},                                      

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

SON

Recommended