12 Mar 2008 C# ile CD’ye Yazdırma Kategori: C#.NET Etiketler: C#C# 2.0 1 Yorum Merhaba arkadaşlar, bu makalemiz de C# ile İmapi’nin CD ya da DVD yazdırmak için sunmuş olduğu DLL’i kullanarak CD ya da DVD yazdırma işleminin nasıl yapılacağına göz atacağız. Makaleye baslamadan önce neden Windows'un bize sunmus oldugu yazma programını ya da nero gibi kabul görmüs bir programı kullanmıyoruz diyebilirsiniz. Bunun bana göre iki yanıtı var. Ilki Eger yazılım gelistiricisi isek mutlaka ve mutlaka böyle bir seyi kendimiz de yazmak istemeliyiz. Ikincisi de programımız da dogan ihtiyaçlardan dolayıdır. Sonuç olarak bizim görevimiz kullanıcıların isteklerini yerine en iyi sekilde getirmek ve onların islerini kolaylastırmaktır. Eger bir katalog programı veya benzeri bir program hazırlıyorsak hazırladıgımız program içerisinden de belirledigimiz ürünlerinin listelenerek kataloga yazdırılmasını saglamak isteyebiliriz. Bu daha mantıklı bir yaklasım sanırım J Ihtiyaçlarımız bununla da sınırlı kalmayacaktır elbette. Isi daha da büyütüp kendi CD yazma programını yazmak isteyebiliriz. J Konuyu anlamak için bir örnek yapalım. Yeni bir proje olusturalım. Ilk olarak projemizin referanslarına IMAPI_CDBurner.dll'ni ekleyelim. Sonra projemize bir class ekleyelim. Bu class içerisinde 3 adet readonly property olacak. Bu propertylerin degerlerini IMAPI_CDBurner.dll'i ile dolduracagız. Ilk property bize sistemimiz de CD Yazmak için gerekli aygıt olup olmadıgını, ikinci property eger sistemimizde CD Yazma aygıtı varsa onun sürücüsünün adını tutacaktır. Üçüncü ve son property de ise CD'ye yazma islemini yaparken kullanılacak olan tampon bellegin yolunu tutacagız. Simdi artık Classımıza geçelim. CDYaz.cs using System; using System.Runtime.InteropServices; using System.Text; namespace CSharpIleCDyeYazma { public class CDYaz { private IMAPI_CDBurner.ICDBurn objBurner; ;//CD Yazma islemini yapacak nesneyi tanımlıyoruz. private bool cdYaziciVarmi = false; private string cdYazici = ""; private StringBuilder cdyeYazilacakAlan = new StringBuilder(1024); [DllImport("shell32.dll")] public static extern Int32 SHGetFolderPath (IntPtr hwndOwner, Int32 nFolder, IntPtr hToken, UInt32 dwFlags, StringBuilder pszPath); const int CSIDL_CDBURN_AREA = 0x03b; //CD Yazıcı olup olmadıgını kontrol edecegimiz property public bool CdYaziciVarmi { get { return cdYaziciVarmi; } } // CD Yazıcımızın path'ni tutacak property public string CdYazici { get { return cdYazici; } } // CD'ye yazmamız için dosyaları kopyalayacagımız path(tampon bölge) public string CdyeYazilacakAlan { get { return cdyeYazilacakAlan.ToString(); } } // Classımızın Constructor'ını tanımlıyoruz public CDYaz() { objBurner = new IMAPI_CDBurner.CDBurnClass();//Burner Nesnesinin instance'ni alıyoruz. int i = 0; objBurner.HasRecordableDrive(out i); cdYaziciVarmi = i > 0; string drive = "???"; objBurner.GetRecorderDriveLetter(drive, 4); // CD Yazıcının sürücü adını burner nesnesi aracılıgı ile alıyoruz cdYazici = drive; SHGetFolderPath((IntPtr)0, CSIDL_CDBURN_AREA, (IntPtr)0, 0, cdyeYazilacakAlan); // Bu metod ile cdYeYazilacak olan tampon bilgisi cdyeYazilacakAlan propertysine set ediliyor } public void YazmaIsleminiBaslat (IntPtr h) // Bu metod ile CD Yazma islemi gerçeklestiriliyor. { objBurner.Burn((uint)h); } } } Burada benin yapacaklarımız simdilik bu kadar. Gelistirmek size kalmıs J Kullanıcı ara yüzünde yapacaklarımıza geçelim. Formum üzerine bir Textbox ve bir adet de Button ekleyelim. Simdi ilk olarak Form yüklenirken sistemimiz de CD yazıcı var mı? Yok mu? Diye kontrol edip. Varsa sürücü adını yazdıralım. Form Load Eventi private CDYaz nCDYaz;nCDYaz = new CDYaz(); private void frmMain_Load(object sender, EventArgs e) { if (nCDYaz.CdYaziciVarmi) { reLog.AppendText("Sisteminiz üzerinde CD Yazıcı var.\r\n"); reLog.AppendText("Sürücü Adı: " + nCDYaz.CdYazici + "\r\n"); reLog.AppendText("Dosyaların Kopyalanacagı Tampon Bellek: " + nCDYaz.CdyeYazilacakAlan); } else { reLog.AppendText("CD'Ye yazmak için Bir CD Yazıcınız yok !"); } } Simdi de yazma için butona tıkladıgımıza yapılacak islemleri yazalım. Button Click Eventi private void btnBurn_Click(object sender, System.EventArgs e) { string kopyalanacakKlasor = @"E:\Belgelerim\Resimlerim";// Bu klasördeki dosyaları CD'ye yazacagız DirectoryInfo di = new DirectoryInfo(kopyalanacakKlasor); FileInfo[] rgFiles = di.GetFiles("*.*"); foreach (FileInfo fi in rgFiles) // Klasördeki dosyaları CD'ye yazılacak alana kopyala { File.Copy(fi.FullName, nCDYaz.CdyeYazilacakAlan + "\\" + fi.Name); } reLog.AppendText("Yazma islemi Basladı..\r\n"); nCDYaz.YazmaIsleminiBaslat(this.Handle); // CD Yazma islemini baslat reLog.AppendText("Yazma isllemi bitti\r\n"); } Kod olarak yapacaklarımız simdilik bu kadar. Artık Test'e baslayabiliriz J Ilk adım basarılı J ileri diyoruz, CD sürücümde CD Yok ve asagıdaki gibi bir uyarı verdi. CD sürücüme CD takıp ileri diyorum, Yazma islemi basladı, Bitmesini bekliyoruz J Ve mükemmel sonuç J Simdi de CD'yi takıp içinde resim var mı yok mu bakalım J Iste bu kadar J Hepimize hayırlı olsun J Bu makalenin de sonuna geldik. Bir sonraki makale de görüsmek üzere. Iyi çalısmalar dilerim. Not: Makale fikrini veren Fatih Sahin'e tesekkürlerimi sunarım. Sem GöksuMCP | MCAD.NET |MCTSsem.goksu@semgoksu.com www.semgoksu.com | www.semgoksu.com Kaynaklar http://msdn.com
06 Haz 2007 Basit bir FTP Uygulaması Kategori: C#.NET Etiketler: C#C# 2.0 7 Yorum Uzun bir aradan sonra tekrardan merhaba arkadaşlar :) Bu makalemizde özellikle web uygulamaları geliştirenlerin işine yarayacak c# ile basitçe bir FTP Client programının nasıl geliştirildiğini anlatacağım. FTP FTP (File Transfer Protocol) Internete baglı bir bilgisayardan digerine (her iki yönde de) dosya aktarımı yapmak için gelistirilen bir internet protokolü ve bu isi yapan uygulama programlarına verilen genel addır. Ilk gelistirilen internet protokollerinden biridir. FTP protokolü ile bir baska bilgisayardan bir baska bilgisayara dosya aktarımı yapılırken, o bilgisayar ile etkilesimli-aynı anda (on-line) baglantı kurulur ve protokol ile saglanan bir dizi komutlar yardımıyla iki bilgisayar arasında dosya alma/gönderme islemleri yapılır. Bir web projesi yada web sitesi yaptıgımızda bunu yayınlamak için bir FTP programına ihtiyaç duyarız. Bunu nasıl yaparız? FTP programını açar, ftp bilgilerimiz ile ftp'ye baglanır ilgili dosyaları ftp alanına transfer ederiz.FTP kullanımı sadece bununla da sınırlı degildir elbette. Örnegin kendi sistemimiz üzerinden (bu bir winform uygulaması olabilir) web sitemize içerik girmemiz gerektiginde ilgili içerige bir dosya eklemek istedigimizde isimizi çok kolaylastıracak bir yöntemdir. .Net Framework da bu isi FtpWebRequest classı ile yaparız. Simdi kısaca bu classı tanıyalım.FtpWebRequestFramework 2.0 içersinde FTP ile çalısmamızı saglayan yeni bir class eklendi. Bu classın adı FtpWebRequest. Bu class System.net namespace'si altında bulunmaktadır. Webclient sınıfını kullanarak uzaktaki bir sunucudan FTP'ye baglanarak bir dosya indirebilir yada sunucuya bir dosya yükleyebiliriz. ÖRNEKBiz bu uygulamamızda kendi uygulamamız üzerinden bir ftp'ye baglanıp FTP'ye bir dosya upload edip yine FTP'en kendi makinemize bir dosya download edecegiz.Ilk olarak yeni bir windows projesi olusturalım;Formumuz üzerine 2 buton ekleyelim. Ilk butona bastıgımızda upload islemini gerçeklestirecek. Diger butonda FTP'den dosya indirmemizi saglayacak. Benim hazırlamıs oldugum form asagıdaki gibidir.Ilk olarak FTP'ye baglanarak bir dosya indirelim. Bunun için gerekli kodları yazmaya baslayalım; FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.xxxxxx.com/xxx/sem.swf"); //Sunucu ile haberlesecek bir FtpWebRequest objesi yarattık. Simdi bu obje için login olmak için gerekli bilgilerini olusturalım.request.Credentials = new NetworkCredential("xxxxx", "xxxxx");using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()){Stream data = response.GetResponseStream();string targetPath = "C:/sem.swf";//Local makinedeki dosyanın tam yolunu belirtelimif (File.Exists(targetPath)) // Dosya varsa sil.File.Delete(targetPath);byte[] byteBuffer = new byte[4096];// Dosyayı loacal makinemize aktarıyoruzusing (FileStream output = new FileStream(targetPath, FileMode.CreateNew)){int bytesRead = 0;do{bytesRead = data.Read(byteBuffer, 0, byteBuffer.Length);if (bytesRead > 0){output.Write(byteBuffer, 0, bytesRead);}}while (bytesRead > 0);}}FTP'den dosyayı indirme islemini tamamladık. Simdi de sunucuya bir dosya yükleyelim. Bunun için gerekli kodlar; FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www. xxxxxx.com/xx/sem.jpg"); // FTP'den indirecegimiz dosyayı belirtiyoruz.request.Method = WebRequestMethods.Ftp.UploadFile;request.Credentials = new NetworkCredential("xxxxx ", " xxxxx ");// Login olmak için gerekli bilgilerini olusturalım.StreamReader sourceStream = new StreamReader("c:/sem.jpg");byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());sourceStream.Close();request.ContentLength = fileContents.Length;Stream requestStream = request.GetRequestStream();requestStream.Write(fileContents, 0, fileContents.Length);requestStream.Close();Upload islemimiz de bu kadar. Simdi bu yaptıklarımızı test edelim ;) Ilk Olarak Yükle butonuna tıklayalım;FTP'ye baglanalım, bakalım upload islemini gerçeklestirmismi?Evet Sem.jpg isimli dosya sunucu da artık J Simdi hemen altındaki sem.swf isimli dosyayı Bilgisayarımıza indirelim. Bunun için indir butonuna tıklayalım.Sonucu görmek için C: sürücüsüne bakalım;Evet sem.swf'yi bilgisayarımıza indirdik. Gerçekten güzel ve ise yarayacak bir class'mıs JBu makalenin de sonuna geldik, baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSUMCP | MCAD.NET | MCTS Örnek Kodlar için mail adresimi kullanabilirsiniz sem.goksu@yazilimgunlugu.comwww.yazilimgunlugu.comKaynaklar http://msdn.com
17 Ara 2006 C# Settings(Ayarlar) Dosyasının Kullanımı Kategori: C#.NET Etiketler: C#C# 2.0 0 Yorum Merhaba arkadaşlar bu makalemizde C# içerisinde Settings dosyalarının nasıl kullanıldığına göz atacağız.Giris .Net FrameWork 2.0 oturum ve uygulama arasında kalan degerlere erismemize ve yeni degerler olusturmamıza izin verir. Bu degerler "Settings" olarak adlandırılır. Settings dosyası kullanımına ihtiyaç duyulan uygulama bilgilerini yada kullanıcı ayarlarını temsil eder. Örnegin; uygulamanın renk seması için kullanıcı ayarlarını saklayan ayarları olusturabiliriz. Yada uygulamada kullanılan bir database'e belirlenen bir ConnectionString''i saklayabilirsin. Settings(Ayarlar) kullanıcıların ayarlarını saklayan profilleri olusturmamıza ve kodun uygulama dısında olan bilgilerine erismemize izin verir. Uygulama Ve Kullanıcı Ayarları Settings'lerin 4 adet özelligi vardır; 1. Name: Çalısma Zamanında ayarın degerine erismek için kullanılan addır.2. Type: Ayarları temsil eden .Net Framework tipidir. Kullanıcı ayarlarını saklar.3. Scope: Çalısma zamanında ayarlara nasıl erisilecegini temsil eden özelliktir.4. Value: Ayarlara erisildiginde geriye döndürülecek olan degerdir. Yeni Bir Settings Dosyası Olusturmak için; 1. Projemiz üzerinde sag tıklayıp, Add New Item 2. Settings Dosyasını seçeriz ve projemize ekleriz. Settings dosyasını projemize ekledik, görünüm olarak biraz inceleyelim; Yukarıda da belirttigimiz gibi Settings dosyalarının 4 adet özelligi var. Name, Type, Scope, Value. Artık örnegimize geçelim ve olusturdugumuz Settings dosyasını kullanalım. Örnek Örnegimizde northwind database'ne baglanıp connection string'i Settings dosyası içerisinden çagıracagız. Formumuzun baslıgını, arka plan rengini ve font adını settings doyası içerisinden alacagız. Formumuzun üzerine bir adet grid ekleyelim. Bu grid içerisinde Categories Tablosundaki kayıtları listeleyecegiz. Simdi Kayıtlarımızı listeleyecek kodları yazalım. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace SettingsFile { public partial class Form1 : Form { public Form1() { InitializeComponent(); } SqlConnection Cnn; SqlDataAdapter Dadp; DataSet Dset; private void Form1_Load(object sender, EventArgs e) { Cnn = new SqlConnection(sem.Default.ConnectionString.ToString()); // ConnectionString Degerini Settings dosyası içerisinden çagırdık. Dadp = new SqlDataAdapter("Select * from Categories",Cnn); Dset = new DataSet(); Dadp.Fill(Dset, "table"); dataGridView1.DataSource=Dset.Tables[0]; } } } ConnectionString'i settings dosyası içerisinden kullandık. Simdi Form baslıgımızı, form backgroundunu ve gridimizin font ayarını settings dosyasından yapalım this.Text = sem.Default.FormBaslıgı.ToString(); this.BackColor = sem.Default.ArkaPlanRengi; this.Font = sem.Default.FormFondu; Evet tüm ayarlarımızı settings dosyası içerisinden ayarladık. Görüldügü gibi form baslıgı, background rengi ve font family settings dosyası içerisinde belirledigimiz degerelere göre geldi.Bu makalenin de sonuna geldik, baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSU MCP | MCAD.NET | MCTS Örnek Kodlar için mail adresimi kullanabilirsiniz askisem@hotmail.com Kaynaklar http://msdn.com
26 Kas 2006 Koleksiyonlar Kategori: C#.NET Etiketler: .NET FrameworkC# 0 Yorum Collectionlar bize Datasetlerden bağımsız çalışmamızı sağlar ve buda bize çok büyük performans kazancı sağlar. Collection lar arraylere benzer ve Classlar içerisine nesneleri yerleştirmemizi sağlar. System.Collection NameSpace'i içerisindeki Collection Classının bazıları; ArrayList BirArray CollectionBase DictionaryBase Hashtable Queue dir. Biz bu makalemizde CollectionBase sınıfına deginecegiz. Ilk olarak bir C# Windows application projesi açalım. Projemizde anlasılması kolay olsun diye SQL Server 2000 da Northwind içerisindeki Kategoriler tablosunu kullanacagız. Ilk olarak projemize bir adet Class ekliyoruz. Clasın adını Kategori olarak belirliyoruz. Buradaki amacımız kategori sınıfına ait bir kategori nesnesi olusturmaktır. Çünkü Collectionlar nesnelerden türerler. Classımızı ekledikten sonra veritabanımıza bir göz atalım. Veritabanımızda var olan alanlar, CategoryID, CategoryName ve Description alanlarıdır. Artık Kategori Classımızı yazabiliriz Kategori.cs using System; namespace Collection { public class Kategori { private int tKategoriNo; private string tKategoriAdi; private string tKategoriAciklama; public Kategori(){} public Kategori(string kategoriadi, string kategoriAciklama) { this.tKategoriAdi=kategoriadi; this.tKategoriAciklama=kategoriAciklama; } public int KategoriNo { get { return tKategoriNo; } set { tKategoriNo=value; } } public Kategori(){} public string KategoriAciklama { get { return tKategoriAciklama; } set { tKategoriAciklama=value; } } public string KategoriAdi { get { return tKategoriAdi; } set { tKategoriAdi=value; } } } } Kategori classı içerisinde Kategoriler tablosuna ait bir kategori nesnesi olusturduk. Simdi bu nesneye ait bir Collection olusturabiliriz. Projemize bir adet daha class ekleyelim ve adını KategoriCollection.cs verelim. using System; using System.Collections; namespace Collection { public class KategoriCollection:CollectionBase //Collection Classları CollectionBase sınıfından türer ve Collection base System.Collections namespace i içerisinde yer alır. { public KategoriCollection(){} /*Burada Collecsiyonunuza bir eleman eklemek için Add Fonksiyonu olusturuyoruz. Dısarıdan Kategori türünde bir kategori nesnesi alır.*/ public int Add(Kategori kategori) { return this.List.Add(kategori); } public int Add(string KategoriAdi, string KategoriAciklama) { Kategori Kategori =new Kategori(KategoriAdi,KategoriAciklama); return this.List.Add(Kategori); } public int Add(int kategorino, string KategoriAdi, string KategoriAciklama) { Kategori Kategori =new Kategori(kategorino,KategoriAdi,KategoriAciklama); return this.List.Add(Kategori); } /* Collectionumuzdan bir eleman silmek için bir void olustururuz. */ public void Remove(Kategori kategori) { this.List.Remove(kategori); } /*Kategori türünde this adında özel bir property olustururuz*/ public Kategori this[int index] { get {return (Kategori)this.List[index];} set{this.List[index]=value;} } } } Kategori Nesnemizi ve Kategori Collectionumuzu olusturdugumuza göre artık bu collectionu kullanabiliriz. Projemize bir adet daha class ekleyelim ve adını KategoriProvider.cs olarak verelim. using System; namespace Collection { public class KategoriProvider { /* Static bir Connection olusturulur */ private static System.Data.SqlClient.SqlConnection Cnn=new System.Data.SqlClient.SqlConnection(Genel.ConnectionString); public KategoriProvider(){} /* Verileri çekmek için GetAllKategori adında bir function olustururuz. Function KategoriCollection türndedir. */ public static KategoriCollection GetAllKategori() { KategoriCollection kc=new KategoriCollection(); System.Data.SqlClient.SqlCommand Cmd=new System.Data.SqlClient.SqlCommand ("Select * from Categories ",Cnn); System.Data.SqlClient.SqlDataReader Dr; Cnn.Open(); Dr=Cmd.ExecuteReader(); while (Dr.Read()) { kc.Add( (int)Dr["CategoryID"], (string)Dr["CategoryName"], (string)Dr["Description"] ); } Dr.Close(); Cnn.Close(); return kc; } } } Evet simdi her sey hazır. Artık collectionumuzu form üzerinde kullanabiliriz. Bunun için formumuza bir adet Datagrid ekleyelim. Gridimizi ekledikten sonra form yüklenirken verileri göstermek için Form_Load eventi içerisine asagıda kodları yazarsak projemizi tamamlamıs olacagız. private KategoriCollection Kc=new KategoriCollection();//Collectionumuzun instance ni olusturduk private void Form1_Load(object sender, System.EventArgs e) { Kc=KategoriProvider.GetAllKategori(); dataGrid1.DataSource=Kc; } Evet projemizi tamamladıgımıza göre artık projeyi çalıstırabiliriz. Iste sonuç Evet arkadaslar makalemizin sonuna geldik bir sonraki makalemizde görüsmek üzere.
26 Kas 2006 Namespace Nedir, Value ve Reference Type’ları Nedir? Kategori: C#.NET Etiketler: .NET FrameworkC# 0 Yorum Namespaces Diger .Net dilleri gibi C#'ta .NET base class library'sinde tanımlanmıs datatype'ları kullanır. Bu classlar namespace adı altında gruplanmıstır. Namespace'e diger bir tanımlama ile classları kullanırken fonksiyonel bir sekilde ulasmamızı saglayan logic containerlar diyebiliriz. Örnek olarak System.Windows.Forms namespace'i ni verebilirim namespace Desta.Deneme.DenemeClasses { public class a() { Public a(){} private string dbname; public string dbName { Get{return dbname;} Set{dbname=value;} } } } using kelimesi ile de namespaceler içerisinde bulunan classları projemize dajil etmis oluruz.. namespace using ile projeye dahil edildikten sonra herhangi bir period belirtmeden namespace içerisinde bulunan tanımlamalara ulasabiliriz. using Desta.Deneme.DenemeClasses; böylece deneme namespace içindeki tüm classlara ve içinde bulunan property ve fonksiyonlara erisebiliriz. using ile compile islemi sırasında modüller arasında herhangi bir link tanımlamıs olmayız. using ile ilgili ilginç bir sey ise onu alias type tanımlamak için kullanabilmemiz. Asagıdaki örnek System.Int32 type'ını intecir adıyla kullanmamızı saglar. using intecir=System.Int32; public class AliasOrnek { public static intecir Main() { intecir i=1; intecir j=i+1; System.Console.WriteLine(j); return 0; } } System Namespace Common Laguage Specification (CLS) bir programlama dili tarafından desteklenmesi kaçınılmaz olan bir çok datatype'ı tanımlayan zengin bir library'e sahiptir. Bu libraryde bulunan Boolean, string, integer, kronolojik ve finansal valueların hepsi System namespace'inin içerisinde yer alır. Bütün typelar object type'ından inherit edilir. Böylece bir object'in referansı herhangi bir tipdeki degiskeni tutmak için kullanılabilir. Long type'ın bit olarak büyüklügü 64'e çıkarılmıstır. Bu sayede Whistler ve XP platformlarında 64 bitlik programlar için bir hazırlık saglanmıstır. (64 bitlik olan bu isletim sistemleri Intel'in yeni nesil 64 bitlik islemcisi Itanium uyumludur) System NameSpace i birçok alt kullanıcı barındırır. System.Web HTML ve Web kontrollerini ,güvenlik, sessionstate, konfigurasyon, bölgesel ayarlar gibi metodları barındırır. System.Data Genel olarak veritabanı islemlerimiz için kullandıgımız NameSpace'dir. System.Windows.Forms Windows Forms uygulamaları için özel ayarları barındırır. System.Drawing Yazdırma ve resim isleme ile ilgili islemlerde kullandıgımız NameSpace'dir. System.XML XML islemleri için kullanılmktadır. süphesiz .Net Framework ün bize sundugu bu zengin kütüphane System NameSpace'i ile sınırlı degil. Value ve Reference Tipleri C# programlama dilinde bildiginiz gibi veri türlerini Reference Types Value Types olmak üzere iki kısma ayırıyoruz. .NET dilleri tarafından kullanılan yada yaratılan her class value ve referans tipleri olarak kategorilendirilebilir. Value ve referans tipleri iki belirgin farklılık gösterir : hafızada tutuldukları yerler ve atama islemi içeriklerdeki davranıslarına göre. Value tipler stackte tutulur, her iki value degeri için yapılmıs atama islemi ile hafızada birbirinin kopyası iki bölüm olusturulur. Referans tipler ise heap'de tutulur. Her iki referans degeri için yapılmıs atama islemi ile memory'deki tek bir yere iki ayrı referans olusturulur. Asagıdaki kod parçasında bir referans türüne ve bir de deger türüne null degerler atanmaya çalısılmaktadır. using System; namespace c1 { class c1 { static void Main(string[] args) { string refTuru=null; int dTuru=null; } } } Bu uygulamayı derlemeye çalıstıgımızda Cannot convert null to 'int' because it is a value type hatasını alırız. Aynı durumu kendi tanımladıgımız referans ve deger türleri içinde gerçeklestirebiliriz. Asagıdaki kod parçasında bu durum örneklenmistir. using System; namespace c2 { class c2 { } struct Dvd { } class C1 { static void Main(string[] args) { Kitap kitap=null; Dvd dvd=null; } } } Bu kod parçasındada aynı hatayı alırız. Çünkü struct' lar deger türüdür ve bu sebeple null degerler alamazlar. Oysaki aynı istisnai durum class gibi kendi tanımlamıs oldugumuz referans türleri için geçerli degildir. Peki deger türlerinin null deger içerme ihtiyacı ne zaman dogabilir? Bir veritabanı uygulamasını göz önüne alalım. Bu tabloda int, double gibi deger türlerine karsılık gelecek alanların var oldugunu düsünelim. Veri girisi sırasında bu int ve double degiskenleri null olarak tabloya aktarmak isteyebiliriz. Ya da tablodan veri çekerken, deger türü karsılıgı alanların null deger içerip içermedigini anlamak isteyebiliriz. Iste bu gibi durumlarda deger türlerinin null veriler içerebilecek yapıda olması, kodumuzun ölçeklenebilirligini arttıracak bir yetkinlik olarak düsünülebilir. Veritabanları için geçerli olan bu senaryoyu göz önüne almadan önce C# 2.0 için deger türlerinin nasıl null veriler tasıyabilecegini incelemeye çalısalım. Deger türlerinin C# 2.0 için iki versiyonu vardır. Nullable deger türleri ve Non-Nullable deger türleri. Bir deger türünün null degerler içerecek tipte olacagını belirtmek için ? tip belirleyicisi kullanılır. using System; using System.Collections.Generic; using System.Text; namespace TestOfNullableValues { class P { static void Main(string[] args) { int? maas; double? pi; maas = null; pi = null; } } } Yukarıdaki kod parçası sorunsuz olarak derlenecek ve çalısacaktır Asagıdaki kod ile iki value degerine atama yapılmakta ve hafızada iki deger kopyası olusturulmaktadır. (kodu derleyip çalıstırmak için /unsafe switch'ini kullanın) using System; public class Simpleclass { public static int Main() { int i; int j; i=5; j=i; Console.WriteLine("i="+i); Console.WriteLine("j="+j); unsafe { if (&i==&j) { Console.WriteLine("i ve j'nin adresleri aynı"); } else { Console.WriteLine("i ve j'nin adresleri farklı"); } } Console.ReadLine(); return 0; } } Bu kod ise iki referans degerine atama yapmakta ve hafızadaki tek kopyaya ulasmaktadır. using System; public class ReferenceType { public int MyValue; } public class SimpleClass { public static int Main() { ReferenceType i; ReferenceType j; i=new ReferenceType(); i.MyValue=5; j=i; Console.WriteLine("i.MyValue="+i.MyValue); Console.WriteLine("j.MyValue="+j.MyValue); unsafe { if (i==j) { Console.WriteLine("i ve j aynı adreste"); } else { Console.WriteLine("i ve j farklı adreste"); } } Console.ReadLine(); return 0; } } Primitives olarak adlandırılan pek çok degisken tipi C#'da value tipi olarak kabul edilir : integer value tipi gibi. Aynı zamanda struct ile tanımlamanan user tipler'de value tipinde tanımlamalardır. Bir sonraki makalemde görüsmek üzere