Uzmanına Sor

Archive for the ‘.NET’ Category

Namespace Nedir, Value ve Reference Type’ları Nedir?

without comments

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

   1:  namespace Desta.Deneme.DenemeClasses
   2:  {
   3:  public class a()
   4:  {
   5:  Public a(){}
   6:  private string dbname;
   7:           public string dbName
   8:           {
   9:                              Get{return dbname;}
  10:                               Set{dbname=value;}
  11:            }
  12:   }
  13:  }

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.

   1:  using intecir=System.Int32;
   2:           public class AliasOrnek
   3:  {
   4:  public static intecir Main()
   5:  {
   6:           intecir i=1;
   7:           intecir j=i+1;
   8:           System.Console.WriteLine(j);
   9:           return 0;
  10:                          }
  11:  }

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.

   1:  using System;
   2:  namespace c1
   3:  {
   4:      class c1
   5:      {
   6:          static void Main(string[] args)
   7:          {
   8:              string refTuru=null;
   9:              int dTuru=null;
  10:          }
  11:      }
  12:  }
  13:  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.
  14:  using System;
  15:  namespace c2
  16:  {
  17:      class c2
  18:      {
  19:      }
  20:      struct Dvd
  21:       {
  22:       }
  23:      class C1
  24:      {
  25:          static void Main(string[] args)
  26:          {
  27:              Kitap kitap=null;
  28:              Dvd dvd=null;
  29:          }
  30:      }
  31:  }

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.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  namespace TestOfNullableValues
   5:  {
   6:      class P
   7:      {
   8:          static void Main(string[] args)
   9:          {
  10:              int? maas;
  11:              double? pi;
  12:              maas = null;
  13:              pi = null;
  14:          }
  15:      }
  16:  }
  17:  Yukarıdaki kod parçası sorunsuz olarak derlenecek ve çalısacaktır
  18:           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)
  19:  using System;
  20:  public class Simpleclass
  21:  {
  22:     public static int Main()
  23:  {
  24:  int i;
  25:  int j;
  26:  i=5;
  27:  j=i;
  28:  Console.WriteLine("i="+i);
  29:  Console.WriteLine("j="+j);
  30:  unsafe
  31:  {
  32:           if (&i==&j)
  33:           {
  34:           Console.WriteLine("i ve j'nin adresleri aynı");                
  35:           }
  36:           else
  37:           {
  38:           Console.WriteLine("i ve j'nin adresleri farklı");               
  39:           }
  40:  }
  41:  Console.ReadLine();
  42:  return 0;
  43:  }
  44:  }
  45:           Bu kod ise iki referans degerine atama yapmakta ve hafızadaki tek kopyaya ulasmaktadır.
  46:  using System;
  47:  public class ReferenceType
  48:  {
  49:  public int MyValue;
  50:  }
  51:  public class SimpleClass
  52:  {
  53:  public static int Main()
  54:  {
  55:  ReferenceType i;
  56:  ReferenceType j;
  57:  i=new ReferenceType();
  58:  i.MyValue=5;
  59:  j=i;
  60:  Console.WriteLine("i.MyValue="+i.MyValue);       
  61:  Console.WriteLine("j.MyValue="+j.MyValue);       
  62:  unsafe
  63:  {
  64:           if (i==j)
  65:           {
  66:           Console.WriteLine("i ve j aynı adreste");                               
  67:           }
  68:           else
  69:           {
  70:           Console.WriteLine("i ve j farklı adreste");
  71:           }
  72:  }
  73:  Console.ReadLine();
  74:  return 0;
  75:  }
  76:  }

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

Written by Sem Goksu

August 2nd, 2010 at 8:25 am

Posted in .NET, C#

Tagged with , , , ,

Hata Yakalama (Exception Handling) – Hata Sınıfı Oluştumak

without comments

Bir önceki makalemizde kullandığımız hata sınıflarının tümü Exception sınıfına aitti. Programcılar bazı durumlarda kendi hata sınıfını oluşturmak isteyebilir. Kendi hata sınıfınızı hazırlarken hazırlayacağınız sınıf Exception ve ApplicationException sınıflarının mirasçısı olmalıdır. Aşağıda basit bir Exception sınıfı oluşturuyorum.

public class MyExceptionClass : Exception
{
public MyExceptionClass()
{

}
}

Oluşturduğum bu sınıfın metodu herhangi bir satıra ve parametreye sahip değil. Bu şekilde oluşturduğumuz Exception sınıfını herhangi bir uygulamada kullanabiliriz. Şimdi sınıfımız test edelim. Bunun için formuma bir buton koyuyorum. Click olayında 2 sayının birbirine eşit olup olmadığını kontrol edecek. Eğer sayılar birbirine eşit değilse Exception fırlatmasını istiyorum.

try
{
int a = 3;
int b = 5;
if (a == b )
{
MessageBox.Show(“Ok”);
}
else
{
throw new MyExceptionClass();
}
}
catch (MyExceptionClass ex )
{
MessageBox.Show(ex.Message);
}

throw keywordunu kullanarak programda bir hata olduğunu ve işlemin catch bloğuna düşmesini sağladım. Catch bloğunda ise hazırladığım exception nesnesinin orjinal mesajını kullanıcıya yansıttım.

image1

Eğer kullanıcıya kendi hazırladığımız hata mesajını göstermek istersek MyExceptionClass sınıfında ki metodumuzun string bir değer alarak bunu kullancıya göstermesini sağlayabiliriz.

private string errorMessage;

public MyExceptionClass(string errorMessage): base(errorMessage)
{

this.errorMessage = errorMessage;
}

Sıfımızı bu şekilde güncelledikten sonra örneğimizi güncelleyerek sonucu görelim.

try
{
int a = 3;
int b = 5;
if (a == b)
{
MessageBox.Show(“Ok”);
}
else
{
throw new MyExceptionClass(“Sayılar birbirine eşit değil”);
}
}
catch (MyExceptionClass ex)
{
MessageBox.Show(ex.Message);
}

image

Bu şekilde kendi exception sınıfımızı üretebilir. Daha da detaylandırabiliriz. Önemli olan sınıfımızda doğru parametreler kullanarak sınıfımızı özelleştirmekten ibaret olacaktır.

Umarım yararlı olmuştur.

Written by Emrah Eroğlu

June 25th, 2010 at 1:19 pm

Posted in .NET, C#

Hata Yakalama(Exception Handling)

without comments

Merhaba bu yazımızda hata yakalama konusu üzerinde duracağız. Geliştirme yaparken farkında olmadan bir çok mantıksal hata yapabilir, run-time’da bu hataların acısını çekerek programınızın sonlandırılmasını izleyebilirsiniz. İşte hata yakalama, run- time’da oluşan ve programızın sonlandırılmasına neden olan hataları yakalamamızı sağlayan ve bu hataların yönetilebilir bir duruma getiren mekanizmadır.

Bazı hataları öngörebilir, bu hatalara gerekli önlemleri siz kod yazarken alabilirsiniz. Peki öngöremediğiniz hatalarda ne olacak? Bu durumda .Net hata yakalama mekanizması devreye giriyor.

Hata yakalama mekanizması nasıl çalışır?

Aslına bakacak olursak .Net için  tüm hatalar bir nesnedir. Oluşan tüm hatalar System.Exception sınıfından türemektedir.Eğer sizin yakalayamadığınız bir hata oluşursa Common Language Runtime bunu yakalar ve programınızın sonlanmasına sebep olur.

Oluşan bu hata nesnelerini nasıl yakalayıp, nasıl yöneteceğiz?

Hata yakalama ve yönetme işlemini aşağıdaki kod bloğunu yazarak gerçekleştireceğiz.

try
{
//Hata oluşabilecek hata kosu bu bloğa yazılır
}
catch
{
//Hata oluşursa bu blok devreğe girer hatayı yakalar ve işler.
}
finally
{
//Hata oluşssada, oluşmasada çalışması istediğimiz bir kod varsa bu bloğa yazılır.
}

Bunu bir örnek ile açıklayacak olursak.

try
{
List<int> numbers = new List<int>();
for (int i = 0; i < 10; i++)
{
numbers.Add(i);
}
MessageBox.Show(numbers[15].ToString());
}
catch (Exception ex)
{
MessageBox.Show(“Hata Mesajı: ” + ex.Message);
MessageBox.Show(“Hatanın oluştuğu kısım: ” + ex.StackTrace );

}
finally
{
Application.Exit();
}

Bu örneğimizde bir sayı koleksiyon oluşduk. Bu sayı koleksiyona ona kadar olan sayıları ekledik. Ama indexi 15 olan bir sayıyı mesaj kutusunda göstermek istedik. Dolayısıyla bu kod parçası hataya düşecektir. catch bloğunda tanımlanan ex Exception nesnesine ait property olan Message bize bu hatayı bir mesaj kutusunda gösterecek, diğer bir property olan StackTrace bize bu hatanın oluştuğu adımı başka bir mesaj kutusunda gösterecek finally bloğunda yer alan Application.Exit() kodu programımızı sonlandıracaktır.

Hata Mesajı:

imag

Hatanın oluştuğu kısım:

image

finally bloğunda yapabileceğiniz durum kodun davranışına göre değişebilir. Örneğin try bloğu içerisinde bir sql bağlantısı oluşturdunuz ve açtınız. bağlantıyı kapattığınız satıra daha gelmeden bir hataya düşerek catch bloğuna düştünüz. Dolayısıyla bağlantınız açık kaldı. Finally bloğunda bu bağlantıyı kapatabilirsiniz.

Birden fazla catch bloğu kullanmak

try
{
List<int> numbers = new List<int>();
for (int i = 0; i < 10; i++)
{
numbers.Add(i);
}

numbers = null;

MessageBox.Show(numbers[15].ToString());
}
catch (NullReferenceException ex)
{
MessageBox.Show(“Hata Mesajı: ” + ex.Message);
MessageBox.Show(“Hatanın oluştuğu kısım: ” + ex.StackTrace);
}
catch (Exception ex)
{
MessageBox.Show(“Hata Mesajı: ” + ex.Message);
MessageBox.Show(“Hatanın oluştuğu kısım: ” + ex.StackTrace);
}
finally
{
Application.Exit();
}

Bu kodda  bir catch bloğu ekleyerek ex NullReferenceException nesnesi yardımıyla boş değerden kaynaklanan işlem hatalarını yakalamaya çalışacağız. Bir önceki örneğimizde kullandığım numbers koleksiyonuna boş değer set ederek boş bir koleksiyonun indeksine ulaşmayı istemek bana bu hata mesajını döndürecektir.

Hata Mesajı:

image1

Hatanın oluştuğu kısım:

image2

Birden fazla catch bloğu kullandığımız zaman catch blokları sırası ile değerlendirilir. Oluşan hata ilk hangi bloğa uyuyorsa o blokta çalıştırılır ve diğer bloklar dikkate alınmaz. Bu nedenle catch bloklarımız oluştururken tüme varım ilkesiyle hareket etmemiz daha iyi olacaktır. Yani özelden genele doğru bir hata yakalama işlemi yapmamız gerekmektedir. Aynı yukarıdaki örnek gibi.

Bir sonraki makalemde kendi hata sınıflarımızı yaratarak kullanacağız.

İyi çalışmalar.

Written by Emrah Eroğlu

June 22nd, 2010 at 1:40 pm

Posted in .NET, C#

C# And API’s

without comments

Merhaba, bu makalemde sizinler API yapisi uzerinde inceleme yapip ufak bir ornek yapmayi planliyorum.

API (Application Programming Interface) Programlar ve Islemci arasinda, komutlardan olusan bir arayuzdur. Genellikle Microsoft’un kendi komutlarindan olusur (Shutdown, Reboot, Open-Close CD-Rom etc.). Windows API’si binlerce fonksiyon, structure, bazi constantlardan olusur (kendi projelerinizde kullanabileceginiz). Bu fonksiyonlar C dili ile yazilmistir, dolayisiyla bunlari kullanmadan declare etmeniz gerekmektedir. DLL proseduru icin declaration islemi biraz kompleks bir sekilde olur. API declaration icin API Viewer kullanabilirsiniz. Bir cok ileri derece programlama dili API Programlamayi destekler. The Microsoft Foundation Class Library (MFC), yuklu miktarda Win32(API) icerir. ODBC API fonksiyonlari, database’de hizli islemler yapmaniza olanak saglar. API ile, uygulamaniz isletim sisteminizdeki dusuk dereceli (lower-level) servislere request atabilir. API binlerce fonksiyonalite destekler. MessageBox’dan Encryption veya Remote Computinge… Bir developer, API’yi kendi programina entegre etmeyi iyi bilmelidir.

APIlerin kullandiginiz isletim sistemi, islemci turune gore cesit cesti tipler icerebilir.

Isletim Sistemi bazli API:

Her bir isletim sistemi API’nin yaygin tiplerine sahiptir.

Ornegin;

Windows NT MS-DOS destekler. Win16,Win32,POSIX (Portable Operating System Interface), OS/2 console API ve Windows 95, MS-DOS, Win16, ve Win32 APIlerini destekler.

Win16 & Win32 API:

Win16, 16-Bit islemciler icin API ile yaratilmistir, ve 16 bitlik degerlere dayanir. Ornegin, Win16 programlarinizi MS-DOS’a baglayabilirsiniz (TSR programlari gibi).

Win32 ise Win16 ile ayni sekilde yaratilmis olup, 32-Bit islemciler icindir, ve 32-Bit’lik degerler kullanir.

Win32 API libraryleri isimlerinden sonra ‘32’ ifadesini icerir. (KERNEL32, USER32 gibi.)

Tum apiler 3 adet kutuphane ile implement edilmistir.

-Kernel

-User

-GDI

1-KERNEL

Kernel, KERNEL32.DLL isminde bir kutuphanedir, ve isletim sistemi’nin yeteneklerini icerir.

-Process Loading

-Context Switching

-File I/O

-Memory Management gibi..

Ornek olarak GlobalMemoryStatus fonksiyonu,size sistemin anlik kullandigi olarak kullandigi fiziksel ve sanal bellek boyutunu gosterir.

2-USER

User, USER32.DLL isminde bir kutuphanedir, ve bu kutuphaneyi kullanaraktan tum kullanici arayuzlerinin yonetimini saglayabilirsiniz.

-Windows

-Menus

-Dialog Boxes

-Icons gibi…

Ornek olarak DrawIcon fonksiyonu, belirtilen noktada size icon veya cursor cizer..

3- GDI (Graphical Device Interface) :

GDI, Win32 tabanli isletim sistemlerinde GDI32.DLL isminde, grafik cikis kutuphanesidir. Windows GDI kullanaraktan, menuleri dialog boxlari cizer. GDI, bir noktada imagelarin saklanmasinda da gorev alir.

Ornek olarak CreateBitmap fonksiyonu, belirtilen ozel olculerde, renklerde bitmap yaratir.

C# Ve API Arasindaki Iliski

APIleri C# icerisinde implement etmek, yazilima yeni baslayanlar icin agir bir istir. Boyle bir islem yapmadan once, bilmeniz gereken bazi basliklar vardir. Bunlara ornek olarak, Structure Implement in C# , type conversion, safe/unsafe code, managed/unmanaged code, ve daha bir cok.

Kompleks APIlerin implementasyonunun once, basit bir MessageBox API implementasyonu ile baslayalim. MessageBox API’sine kod implement etmeden once basit bir Windows Application yaratalim, Form’a bir tane button ekleyin ve Button’un click eventinde Message Box’da kod gosterelim. Tabii ki bu islem icin harici bir kutuphane kullanacagiz.

Kullanilacak NameSpace:

using System.Runtime.InteropServices;

Ve simdiki satira dikkat! Bu satirda API’ deklarasyonu yapiyoruz:

[DllImport("User32.dll")]

public static extern int MessageBox(int h, string m, string c, int type);

Unmanaged Code’dan cagrilacak method icin DLL importu yaptik, “USER32” ifadesi ise hangi DLL’i import edecegimizi belirtmek amacli kullanilmistir. Kullanmis odugumuz MessageBox(), integer donduren, ve 4 parametre alan bir fonksiyondur.

Bir cok API degerleri kullanmak ve getirmek icin structure yapisi kullanir.

Button’un click eventine asagidaki kod blogunu ekleyelim

protected void button1_Click (object sender, System.EventArgs e)
{
MessageBox (0,"API Message Box","API Demo",0);
}

Uygulamanizi Run ettiginiz zaman, APi fonksiyonunu kullanarak cagirmis oldugunuz bir messagebox goreceksiniz.

Birde structure kullanaraktan bir ornek yapalim.

Structure ile calismak, komplex APIler kullanir, veya structure icerisinde structure kullanir. Bu islemlerler siradan basit bir API kullanmaktan daha zordur. Structure ornegimde GetSystemInfo API’sini kullanaraktan, varolan sistem bilgilerini cekecegim.

Yeni bir C# formu acin, ve bir tane button ile listbox ekleyin. Kod tarafina asagidaki namespace’i ekleyin

using System.Runtime.InteropServices;

Declare structure, GetSystemInfo’nun bir parametresidir. Ustteki kod blogunun hemen ardindan

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

API fonksiyonun deklarasyonu: bu islem icin kernel32.dll’ini import ediyoruz.

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

   1:  protected void button1_Click (object sender, System.EventArgs e)
   2:  
   3:  {
   4:  
   5:  try
   6:  
   7:  {
   8:  
   9:  SYSTEM_INFO pSI = new SYSTEM_INFO();
  10:  
  11:  GetSystemInfo(ref pSI);
  12:  
  13:  //
  14:  
  15:  //
  16:  
  17:  //
  18:  
  19:  
  20:  
  21:  
  22:  listBox1.Items.Insert(0,pSI.dwActiveProcessorMask.ToString());
  23:  
  24:  //
  25:  
  26:  //
  27:  
  28:  //
  29:  
  30:  }
  31:  
  32:  catch(Exception ex)
  33:  
  34:  {
  35:  
  36:  MessageBox.Show (ex.Message);
  37:  
  38:  }
  39:  
  40:  }

Application’ i Run ettikten sonra, sekildeki gibi sistem bilgilerini goruntuleyebileceksiniz.

image

Written by Serkan Hekimoğlu

June 11th, 2010 at 2:40 pm

Posted in .NET, C#

Tagged with ,

Create Your Own RSS (Real Simple Syndication) Reader With .NET

without comments

Merhaba, bu makalemde sizlerle .Net platformu uzerinden kendi RSS Reader’imizi olusturmaya dair ornek yapacagim. Oncelikle RSS nedir? RSS çeşitli internet siteleri tarafından yayınlanan haber vb. içeriğin tek bir ortamdan topluca izlenebilmesine olanak sağlayan yeni bir içerik besleme yöntemidir. RSS yöntemini destekleyen sistelerin hazırladıkları XML biçimli dosyalara bir çok programla erişmek mümkündür. XML okuyucusu olan bu programlar, web gezgini veya e-posta istemcisi olabileceği gibi sadece RSS içereriği izlemek için hazırlanan masaüstü programları da olabilir. RSS Urllerini ister DB de muhafaza eder her seferinde elle yazmaya gerek kalmadan DB’den okuruz, veya benim ornekte yapacagim gibi tek bir URL kullanarakta yapilabilir.

Oncelikle Rss Reader icin bir windows app project olusturalim.

image

 

Hemen ardindan sekilde UI tasarimini yapalim.

 

image

Globalde tanimlanan degiskenler:

XmlTextReader rssReader;
XmlDocument rssDoc;
XmlNode nodeRss;
XmlNode nodeChannel;
XmlNode nodeItem;
ListViewItem rowNews;

 

Read Button Click Eventinde yazilacak kod :

   1:  rssReader = new XmlTextReader(txtUrl.Text);
   2:              rssDoc = new XmlDocument();
   3:   
   4:              rssDoc.Load(rssReader);
   5:   
   6:   
   7:              for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
   8:              {
   9:   
  10:                  if (rssDoc.ChildNodes[i].Name == "rss")
  11:                  {
  12:   
  13:                      nodeRss = rssDoc.ChildNodes[i];
  14:                  }
  15:              }
  16:   
  17:              for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
  18:              {
  19:   
  20:                  if (nodeRss.ChildNodes[i].Name == "channel")
  21:                  {
  22:   
  23:                      nodeChannel = nodeRss.ChildNodes[i];
  24:                  }
  25:              }
  26:   
  27:              lblTitle.Text = "Title: " + nodeChannel["title"].InnerText;
  28:              lblLanguage.Text = "Language: " + nodeChannel["language"].InnerText;
  29:              lblLink.Text = "Link: " + nodeChannel["link"].InnerText;
  30:              lblDescription.Text = "Description: " + nodeChannel["description"].InnerText;
  31:   
  32:              for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
  33:              {
  34:   
  35:                  if (nodeChannel.ChildNodes[i].Name == "item")
  36:                  {
  37:                      nodeItem = nodeChannel.ChildNodes[i];
  38:   
  39:   
  40:                      rowNews = new ListViewItem();
  41:                      rowNews.Text = nodeItem["title"].InnerText;
  42:                      rowNews.SubItems.Add(nodeItem["link"].InnerText);
  43:                      listBox1.Items.Add(rowNews.Text);
  44:                  }
  45:              }

Ve son olarak eklemis oldugumuz listBox’in Selected Index Changed Eventine eklenecek kod:

 

URL Text Box’ina yazilan Rss URL’i Read Buttonunda kullanilacak olan URL’dir, ve List Box’a URL icerisindeki veriler gelir.

 

if (listBox1.SelectedItems.Count == 1)
            {

                for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
                {

                    if (nodeChannel.ChildNodes[i].Name == "item")
                    {
                        nodeItem = nodeChannel.ChildNodes[i];

                        if (nodeItem["title"].InnerText == listBox1.SelectedItems[0].ToString())
                        {
                            txtContent.Text = nodeItem["description"].InnerText;

                            break;
                        }
                    }
                }
            }

Written by Serkan Hekimoğlu

June 7th, 2010 at 10:46 am

Posted in .NET

Tagged with , , ,

C#.Net le Windows Service ve Message Queuing Uygulaması

without comments

Windows service uygulamalari start stop olarak iki asamali bir yapi sunsa da startla baslayan ve devam eden bir surecte icerdigi icin bir kompozisyon calismasi gibi gelir bana; giris gelisme sonuc.
Her asamada yapmak istediklerini kolayca uygulayabileceginiz konfigurasyon konusunda hem config dosyalarini hem de guvenlik icin windows guvenlik ayarlarini adapte edebileceginiz windowsun bu edebi yaklasimli uygulamasina artilariyla oldugu kadar eksileriyle de bakmaya calisalim.

image Visual Studio da sekilde gorulecegi uzere project tiplerinden windows service secerek uzerinde calisacagimiz ana projeyi olusturmakla ise baslayalim. Anlatima partner olarak olarak sectigim bu projede Message Queuing yapisini kullanarak queu yu dinleyen ve gelen paketi mail olarak gonderen ya da paket geldiginde belli kisilere mail olarak uyari gonderen bir servis yazmaya calisacagim.

Windows service projesini olusturdugumuzda karsimiza design viewda acilacak olan ekranda herhangi bir islem yapmayi planlamadigim icin direk olarak code view a geciyorum. Code viewda goreceginiz uzere makalenin girisinde de soyledigimiz gibi Start ve Stop override functionlari ServiceBase den otomatik olarak implemente edilmis olarak gelmekte.

image

Giris gelisme ve sonuc dedigimiz yapiyi servise uygulamak icin isStopped seklinde bir property tanimlayarak start icerisinde olusturacagim processi servis stop olana kadar devam ettirmek yonunde bir yapi kurguluyorum. Bunu bir sleep mekanizmasi kurgulayak belli araliklarla queu yu dinlemek seklinde de tasarlayabilirdik ama servis stop olana kadar kuyrugu dinlemesi ve anlik mesaj atimini saglamasi ornegimiz acisindan daha tercih edilir bir yapi olarak gozukmekte.

image

Bu kurguladigimiz yapiya uygun olarak OnStart processini guncellememiz gerekicek. Bu guncellemeyle birlikte queue yu dinlememiz ve yeni bir mesaj geldiginde haberdar olmamiz gerek. Bunun icin bir handler yazarak bunu gueue ya ReceiveCompleted Handler i olarak attach etmemiz gerekecek. Boylelikle uygulamamizin son asamasi olan mail gonderimini saglayacak ve uyarilar ilgili maillere gonderilecektir. OnStartta gorulecegi uzere proje dahilindeki settings yapisi kullanilarak Queue pathi verilebilmekte ve bu da kullanimi kolaylasirmaktadir.

image

Uygulamamiza son seklini verdikten sonra basit olarak maili atacak fonksiyonu da uygulamamizin icine dahil ediyoruz. Ayri bir yapilandirmayla mail mimarisini harici bir class icerisinde tutmak daha saglikli olacaktir. Ancak ornegimiz icerisinde gozukmesi acisindan mail fonksiyonunu da buradaki govdeye ekledik.

image

Mail fonksiyonalitesiyle birlikte giris gelisme ve sonuc kismimiz tamam. Ancak service uygulamasi icin bir proje daha ekleyerek kurulum asamasini da yapilandirmamiz gerekli. Setup & install asamasini da projemize ekleyerek servisimizin manual degil de kolay bir arayuzle kurulmasini saglamak kullanislilik acisindan faydali olacaktir.

image

Bunun icin ekranda da gorulecegi uzere Other project types kismindan setup & deployment secenegi secilerek sagdaki kisimdan da Setup projesi secilmek suretiyle projemize Setup asamasini katmis oluyoruz.

image

Setup asamasini yapilandirmak icin, ekran goruntusunde gorulecegi uzere proje uzerine sag tiklayarak add project output secerek kuruluma dahil edilecek olan projemizi ekliyoruz. Setup Project->Add->Project Output->Service1(Primary Output)

image

Bu eklemeyi yaptiktan sonra Setup Project->View->Custom Actions sekmesini takip ederek custom actionlarin sagda listelenmesini sagliyoruz. Bu asamayla birlikte Install Rollback asamalarinda neler olacagini tanimlamis olacagiz. Bunun acilan ekranda Custom Actions a sag tiklarak ekrandaki gibi application folderdan primary output olarak ekledigimiz projeyi secerek Custom Actions a dahil ediyoruz.

image

Bu dahil etme isleminden sonra once primary projeyi daha sonra setup projesini build ederek setup projesinde build configurationinda Setup projesi icinde build sekmesini isaretliyoruz. Boylelikle build islemiyle birlikte install icin gerekli msi dosyamiz olusturularak kullanilabilir bicimde sunulmus olacaktir.

Bu islemler sonucunda setup projesine sag tiklayarak install\uninstall secenekleriyle windows servisimizi kurup geri yukleyebiliriz.

Written by Mustafa Alkan

May 26th, 2010 at 4:46 pm

How to Compress and Decompress a DataSet

without comments

Veri odaklı projelerde en sık kullanılan nesnelerin başında DataSet ve DataTable nesneleri yer alıyor. Ancak çalıştığımız veriler ve yapılar arttıkça, bu nesnelerle verileri taşımak oldukça zahmetli olabiliyor.
Şu anda yürüttüğüm projeden bir örnek vererek durumu açıklamak istiyorum;

Picture1 
Grafikte gördüğünüz senaryoda A noktasındaki merkezi sisteme B, C ve D noktalarından veri aktarımı gerekiyor. Aktarılacak veri 100 MB ile 5 GB arasında değişiyor. C ve D noktalarındaki bağlantı metro ethernet olduğu için herhangi bir sorun yaşamıyoruz ancak B noktasına giden hat bir noktaya kadar fiberken, B noktasının lokasyonunun getirdiği bir zorunluluktan dolayı bağlantı PDH oluyor ve ciddi oranda yavaşlık ortaya çıkıyor. Veri çekmek istediğimiz B sistemini günün 24 saati 400 ayrı lokasyondaki client kullandığı için hat üzerindeki yük, hattın kaldırabileceğinin çok üzerinde kalıyor. Bu noktadan çekmek istediğimiz veri dataset olarak 4.2 GB civarında.

Bu senaryoya bakacak olursak, durumun vehametini açıkça kavrayabiliriz.
Bu noktada uygulayacağımız basit bir çözümle, bu dataset’in boyutunu ciddi oranda minimize edebiliriz.

Visual Studio 2005 ile birlikte gelen System.IO.Compression alan adı zip ve gzip sıkıştırma algoritmalarını sunmakta. Bu makalede, bu algoritmaları kullanarak bir dataset nesnesini nasıl sıkıştırıp, nasıl açabileceğimizi göreceğiz.

İlk olarak sıkıştırma fonksiyonumuzu yazıyoruz;

public static byte[] CompressDataSet(DataSet ds)
{
    ds.RemotingFormat = SerializationFormat.Binary;
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, ds);
    byte[] inbyt = ms.ToArray();
    MemoryStream objStream = new MemoryStream();
    DeflateStream objZS = new DeflateStream(objStream, CompressionMode.Compress);
    objZS.Write(inbyt, 0, inbyt.Length);
    objZS.Flush();
    objZS.Close();
    return objStream.ToArray();
}

İkinci aşamada sıkıştırmayı tersine çevirecek fonksiyonu yazıyoruz:

public static DataSet DecompressDataSet(byte[] bytDs, out int len)
       {
           System.Diagnostics.Debug.Write(bytDs.Length.ToString());
           DataSet outDs = new DataSet();
           MemoryStream inMs = new MemoryStream(bytDs);
           inMs.Seek(0, 0);
           DeflateStream zipStream = new DeflateStream(inMs, CompressionMode.Decompress, true);
           byte[] outByt = ReadFullStream(zipStream);
           zipStream.Flush();
           zipStream.Close();
           MemoryStream outMs = new MemoryStream(outByt);
           outMs.Seek(0, 0);
           outDs.RemotingFormat = SerializationFormat.Binary;
           BinaryFormatter bf = new BinaryFormatter();
           len = (int)outMs.Length;
           outDs = (DataSet)bf.Deserialize(outMs, null);
           return outDs;
       }

       public static byte[] ReadFullStream(Stream stream)
       {
           byte[] buffer = new byte[32768];
           using (MemoryStream ms = new MemoryStream())
           {
               while (true)
               {
                   int read = stream.Read(buffer, 0, buffer.Length);
                   if (read <= 0)
                       return ms.ToArray();
                   ms.Write(buffer, 0, read);
               }

           }
       }

Son olarak bu fonksiyonların kullanımını örnekliyoruz:

private DataSet _dataSet = new DataSet();
      private byte[] _compressedDs;
      private DataSet _deCompressedDs;

      private void button1_Click(object sender, EventArgs e)
      {
          DateTime start = DateTime.Now;

          byte[] compressedDs = CompressDataSet(_dataSet);
          File.WriteAllBytes("CompressedDataSetContent.txt", compressedDs);
          int i;
          _deCompressedDs = DecompressDataSet(compressedDs, out i);
          _deCompressedDs.WriteXml("DecompressedDataSet.xml");

          TimeSpan ts = DateTime.Now – start;
          MessageBox.Show(string.Format("{0}dk, {1}sn, {2}sl", ts.Minutes, ts.Seconds, ts.Milliseconds));
      }

Sonuçlara gelecek olursak, bu kodlarla sıkıştırdığımız 154.736 KB’lık bir dataset, 15 saniye gibi bir sürede  8.535 KB’ya düşüyor. Bu da senaryodaki gibi bir network ortamında oldukça önemli bir kazanım.

Written by Kadir Sümerkent

February 19th, 2010 at 4:22 pm

Posted in .NET, C#

Tagged with

VISUAL C# – DELEGATES AND EVENTS – PART II: Event Handler

with one comment

EventHandler aslında bir metod değil bir delegedir. event deklerasyonunda kullanıldığında yeni event artık bir EventHandler delegesi gibi davranır. Bu demektir ki event’e ancak EventHandler’da belirtilen type’da metod bağlanabilir. Bu yeni metodların returnType’ı ve Signature’ı da haliyle <void> <object, EventArgs> olacaktır.
Bu yüzden listeye eklenecek metodların EventHandler delegesiyle uyumlu olması gerekir.

    Bir event objesi yaratıldığında new kullanılmaz,
    event declare class içinde yapılır,
    event’ler çalıştırılabilir bir kod bloğunun içinde declare edilemezler.

     

    Event Handler ile yapmak istedigim ornek, bir insanin bir yiyecek yemesi. Olusturmak istedigim classlar, Insan, Meyve, ve Meyvenin icerisindeki vitamin class’i.

     

    public class Meyve
        {
            private string MeyveAdi_;
            public string MeyveAdi
            {
                get { return MeyveAdi_; }
                set { MeyveAdi_ = value; }
            }
        }
    
    
    public class VitaminDegerleri
        {
    
            public VitaminDegerleri(int C, int D)
            {
                this.CVitamini_ = C;
                this.DVitamini_ = D;
            }
    
            private int CVitamini_;
            public int CVitamini
            {
                get { return CVitamini_; }
                set { CVitamini_ = value; }
            }
    
            private int DVitamini_;
            public int DVitamini
            {
                get { return DVitamini_; }
                set { DVitamini_ = value; }
            }
        }

     

     public class Insan
        {
            public event MeyveYedimEventHandler MeyveYedim;
    
            private Meyve OdamdakiMeyve = null;
    
            public void SerkaninGetirdigiMeyveyiAl(Meyve SerkaninVerdigiMeyve)
            {
                this.OdamdakiMeyve = SerkaninVerdigiMeyve;
            }
    
            public void MeyveyiYe()
            {
                MessageBox.Show(this.OdamdakiMeyve.MeyveAdi + " yedim !");
                if (this.MeyveYedim != null) MeyveYedim(new VitaminDegerleri(34, 57));
            }
        }

     

     

    Ve Eventimiz icin kullanlicak delegate:

    public delegate void MeyveYedimEventHandler(VitaminDegerleri vtm);

     

    Eventimizi tetikleyecek olan method ise su sekildedir:

    void Ins_MeyveYedim(VitaminDegerleri e)
            {
    
            }

     

    Simdi sirada Form_Load’da kullanilacak kodlarimiz var:

     

     private void SerkanHekimogluEvents_Load(object sender, EventArgs e)
            {
                Insan ins = new Insan();
                ins.MeyveYedim += new MeyveYedimEventHandler(Ins_MeyveYedim);
    
                Meyve myv = new Meyve();
                myv.MeyveAdi = "Elma";
    
                ins.SerkaninGetirdigiMeyveyiAl(myv);
                ins.MeyveyiYe();
            }

     

    Event kullanimida, gordugunuz uzere Delegates kadar kolay. Sorulariniz icin bana iletisim bolumunden ulasabilirsiniz.

     

     

     

     

     

     

    Written by Serkan Hekimoğlu

    January 18th, 2010 at 11:47 am

    Posted in .NET, C#

    Tagged with , , ,

    VISUAL C# – DELEGATES AND EVENTS – PART I: Delegates

    without comments

    Bugunku makalemizde sizlerle Temsilciler (Delegates) hakkinda incelemede bulunup, ornek yapacagiz. Temsilciler (Delegates) her ne kadar ileri derece bir kavram olsada her seviyeden C# ile ugrasan kisilerin bilmesi gereken bir yapidir. Tabii ki Delegates kullanmadan bir projeyi yapabilirsiniz. Fakat o zaman yapamayacaginiz isler, yapabilecekleriniz onune gecer.

    Delegates bir projede bir veya birden fazla methodu gosteren bir referans turunden bir nesnedir. Delegates’i kullanamaya baslamadan once tipki bir method tannimlar gibi, delegate’imizin tanimlamasini yapariz. Delegates 2 islem arasinda anahtar gorevi gorur.

    image (C-Sharp Nedir’den alintidir)

     

    Delegates’i size anlatmak icin kullanacagim ornektenten biraz bahsedeyim. Gunluk yasantimizda Delegates’in yaptigi ise verebilecegim en iyi ornek, Lamba ve Lambayi calistiran Dugmedir. Dugme, lambanin yanmasini tetikleyen bir anahtardir(aradaki kablo vasitasi ile). Bunu ornegimizde daha iyi anlayabiliriz. Ornegimize baslarken Ampul ve Dugme’ icin Class yazalim.

    Ampul Class’i :

    public class Ampul
        {
            private string Marka_;
            public string Marka
            {
                get { return this.Marka_; }
                set { this.Marka_ = value; }
            }
    
            public Ampul(string AmpulMarka)
            {
                this.Marka_ = AmpulMarka;
            }
    
            public void BagliBulundugumDugmeyeBasildi(DugmeDurumu Sinyal)
            {
                if (Sinyal == DugmeDurumu.Acik)
                {
                    System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanıyor !");
                }
                else if (Sinyal == DugmeDurumu.Kapali)
                {
                    System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanmıyor !");
                }
            }
        }

    Dugme Class’i:

    public class Dugme
        {
    
            public event KabloDelegate SinyalGeldi;
    
            private DugmeDurumu DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
    
            public DugmeDurumu DugmeninAnlikDurumu
            {
                get { return this.DugmeninAnlikDurumu_; }
            }
    
            private KabloDelegate DugmeBaglantiKablosu = null;
    
            public void AcKapat()
            {
                if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
                }
                else
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
                }
    
                if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
            }
        }

    Dugme durumunu belirtmek icin Enum kullanalim:

     public enum DugmeDurumu
        {
            Acik,
            Kapali
        }

     

    public void AcKapat()
            {
                if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
                }
                else
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
                }
    
                if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
            }

    Ve en onemlisi anahtar gorevi gorecek olan Delegate’imizi tanimlayalim:

    public delegate void KabloDelegate(DugmeDurumu dgm);

     

    Simdide sira FormLoad’a yazilacak kodlarda:

    private void SerkanHekimogluDelegates_Load(object sender, EventArgs e)
            {
                Ampul amp = new Ampul("Birinci Ampul");
                Ampul amp2 = new Ampul("Ikinci Ampul");
    
                Dugme dgm = new Dugme();
    
                dgm.SinyalGeldi += new KabloDelegate(amp.BagliBulundugumDugmeyeBasildi);
                dgm.SinyalGeldi += new KabloDelegate(amp2.BagliBulundugumDugmeyeBasildi);
    
                dgm.AcKapat();
            }

     

    Formumuzu Run ettigimizde, Form Load’a koydugumuz Temsilcilerimizin, tanimlamis oldugu Joblari yaptigini goreceksinizdir.

     

    Eventler hakkinda bilgiyi ve ornegi ikinci makalemizde yapacagiz.

     

     

     

    Written by Serkan Hekimoğlu

    January 18th, 2010 at 11:21 am

    Posted in .NET, C#

    Tagged with , , ,

    C# Extension Methods

    without comments

    C# dilinin güzel özelliklerinden biri 2.0 ve öncesinde gerçekten uğraştırıcı bir işi son derece kolaylaştıran extension methods. Bu makalede extension methods’In ne olduğunu ve nerelerde kullanabileceğimizi anlatıyor olacağım.

    Kısaca basit bir tanımını yapmak gerekirse extension methods sadece static classlar içinde tanımlanabilen, parametre tanımlamalarında türden önce this ifadesini kullandığımız ve standart CLR türlerine yeni metodlar eklemek amacıyla kullandığımız static metodlardır. Hemen basit bir örnek ile extension metodların uygulamasını görelim;

    İlk olarak aşağıdaki static class’ı hazırlıyoruz*:

    public static class extensionMethods
    {
             
    public static int ToInt32Ext(this string s)
              {
                       
    return Int32
    .Parse(s);
              }

              public static int ToInt32Static(string s)
              {
                       
    return Int32
    .Parse(s);
              }
    }

    Hemen sonrasında bu classta tanımladığımız metodları kullanıyoruz;

    private void button1_Click(object sender, EventArgs e)
    {
             
    string s = "9";

              int i = s.ToInt32Ext(); // extension method kullanm
              label1.Text = i.ToString();

              int j = EMClass.ToInt32Static(s); // standart kullanm metodu
              label2.Text = j.ToString();
    }

    Örneğimizi inceleyecek olursak;
    1. ToInt32Ext metodunda parametrelerimizi tanımlarken tür ifadesinden önce this keywordunu kullanıyoruz.
    2. Extension Methodları kullanırken this ile tanımladığımız parametreyi göndermiyoruz. Yukarıdaki örnekte görebileceğiniz gibi Extension Methodu kullanırken herhangi bir parametre göndermedim, ancak static metodu kullanırken gerekli parametreyi gönderdim.
    3. Extension methodlar sadece static classların içinde tanımlanabilirken static metodlar için böyle bir zorunluluk bulunmamaktadır.
    4. Extension methodlar sadece instance değerler üzerinden çağrılabilir. Bir class içinden çağırmaya çalışmamız halinde compile time hatası alırız.

    Email Adresi Denetimi
    string türünün metodları arasında bildiğimiz gibi objenin kaç karakterden oluştuğunu veren Length, karakterleri büyük harfe çeviren ToUpper, ya da tam tersini yapan ToLower metodları gibi metodlar bulunmaktadır. Doğal olarak tasarım aşamasında string türü için IsValidEmailAddress şeklinde değişkene atanan değerin geçerli bir email adresi olup olmadığını denetleyecek, belirli bir gereksinime yönelik bir fonksiyon oluşturulamazdı ve bu işlemi yapmak için değişkenimizi yazdığımız denetim fonksiyonuna gönderirdik. Extension Methods sayesinde string türüne email adresi denetimini yapacak bir fonksiyon hazırlayarak bunu instance’ın kendisinden çağırabiliyoruz. Hemen örnekliyoruz;

    İlk olarak extensionMethods classımıza aşağıdaki denetim fonksiyonunu ekliyoruz;

    public static bool IsValidEmailAddress(this string s)
    {
              Regex regex =
    new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
             
    return regex.IsMatch(s);
    }

    Hemen ardından test formumuzun içinden bu fonksiyonu kullanıyoruz;

    private void button1_Click(object sender, EventArgs e)
    {
              string email = "kadir@sumerkent.com";
              bool result = email.IsValidEmailAddress();
    }

    xext0000
    Şekil 1: IntelliSense içinden extension methoda erişim

    Bu kullanımın sonucunda result değişkeni true değerini alacaktır, ancak email değişkeninde geçersiz bir email adresi yazmış olsaydım false değerini alacaktı.

    Kullanımımızı aşağıdaki gibi değiştirerek email değişkenine geçersiz bir email adresi belirtirsek, çalışma zamanında button tıklandığında bir hata mesajı alırız.

    private void button1_Click(object sender, EventArgs e)
    {
             
    string email = "kadir@sumerkent.com";
              if(!email.IsValidEmailAddress())
              {
                        MessageBox.Show("Invalid email address specified.");
              }
    }

    LINQ
    Elbette extension methodlar bu kadarla sınırlı değil. Bu fonksiyonun asıl önemi, LINQ devreye girdiği zaman ortaya çıkıyor.

    Şirketimizdeki çalışanların listesini tutarken kullanmak için basit bir employee classı oluşturalım;

        public class Employee
        {
            public string Name
            {
                get; set;
            }
            public string LastName
            {
                get; set;
            }
            public int Age
            {
                get; set;
            }
            public decimal Salary
            {
                get; set;
            }
     
            public string Email
            {
                get; set;
            }
        }

    Şimdi employee instanceları içeren bir generic list oluşturalım ve bir kaç sorgu çalıştıralım;

           List<Employee> employees = new List<Employee>();
           employees.Add(new Employee { Name = "Kadir", LastName = "Sümerkent", Age = 26, Salary = 100, Email = "kadir@sumerkent.com" });
           employees.Add(new Employee { Name = "Bill", LastName = "Gates", Age = 50, Salary = 1000, Email = "bill@gates.com" });
           employees.Add(new Employee { Name = "Steve", LastName = "Ballmer", Age = 30, Salary = 800, Email = "steve@ballmer.com"});
           employees.Add(new Employee { Name = "Bakkal Orkun", LastName = "Balkancı", Age = 29, Salary = 50, Email = "bakkal@" });
           employees.Add(new Employee { Name = "Seda", LastName = "Sayan", Age = 18, Salary = 5000, Email="seda" });

    Şimdi bu liste üzerinde LINQ ile bir kaç sorgu çalıştıralım;

        IEnumerable<Employee> result;
     
        //Maaşı 500'den büyük olan personelin listesi
        result = employees.Where(emp => emp.Salary > 500);
     
        //Yaşı 30'dan yüksek olan personelin listesi
        result = employees.Where(emp => emp.Age > 30);
     
        //İsmi B ile başlayan personelin listesi
        result = employees.Where(emp => emp.Name.StartsWith("B"));
     
        //email adresi geçersiz olan personelin listesi
        result = employees.Where(emp => !emp.Email.IsValidEmailAddress());

    Written by Kadir Sümerkent

    January 11th, 2010 at 2:21 pm

    Posted in .NET, C#