c# akademi 2005
TRANSCRIPT
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