12 Mart 2008 Çarşamba

Extension Methods nedir ?

c# 3.0 ile gelen yeni bir özelliktir. Bu metod yazılımcıya var olan bir tipe herhangi bir yeniden bir tip yaratma

olmadan yeni methodlar eklemeye olanak tanır.
Uzun zamandır beklediğim bir özellik idi çünkü bazı kontroller için uzun uzadıya ilgili sınıfı çağırmak zor geliyodu bana .
Mesala bir string değer in email olup olmadığını kontrol etmek için bir utility classı yazıp ilgili
class ta da IsValidEmail(string str) gibi bir fonksiyon bulunmakta ve değerin kontol etmek istediğimde de IsValidEmail(strEmail) yazmakta idim.Aslında bunda yanlış bir şey yok ama okunurluk bazında zor oluyordu.
Şu şekilde olması sizce de iyi olmaz mı? strEmail.IsValidEmail() bu kod daha okunaklı değil mi? bu yapacaklarımızdan sadece bir tanesi .
peki aynı şekilde diğer sık kulladığımız sınıflara da eklemek istemez miyiz ?
Niye her zaman bir string değeri
sayıya dönüştürken Convert.ToInt32(değişken) şeklinde yazıyoruz da neden degisken.ToInt32() yazamıyorum.İşte burada c# 3.0 ile gelen bu özellik sayesinde ilgili isteklerimiz yapabiliyoruz.

İlgili Class Yapısını string değer için şu şekilde yazabiliriz.

using System;
namespace ExtensionMethods
{
public static class ExtensionMethods
{

private static readonly string CharactersLowerCase = "abcdefghijklmnopqrstuvwxyz";
public static readonly string ValidEMailCharacters = "0123456789abcdefghijklmnopqrstuvwxyz_";

#region Method - ToInt32

public static int ToInt32(this string str)
{
return Int32.Parse(str);
}

#endregion

#region Method - IsMoney

public static bool IsMoney(this string value)
{
if (value == null)
return false;
string tmp = value.Trim();
if (tmp.Length == 0)
return false;
for (int i = 0; i < tmp.Length; i++)
if (!char.IsDigit(tmp, i) && tmp.ToCharArray()[i] != ',')
return false;
return true;
}

#endregion

#region Method - EMail

public static bool CheckEMail(this string eMail)
{
if (eMail == null)
return false;
string email = eMail.Trim();
string[] strEmail = email.Split(new char[] { '@' });
if (strEmail.Length != 2 || strEmail[0].Length < 2 || strEmail[1].Length < 5)
return false;

string[] left = strEmail[0].Split(new char[] { '.', '-' });
for (int i = 0; i < left.Length; i++)
if (left[i].Length < 1 || !CheckEMailPart(left[i]))
return false;
string[] right = strEmail[1].Split(new char[] { '.' });
if (right.Length < 2 || right[right.Length - 1].Length < 2)
return false;
for (int i = 0; i < right.Length - 1; i++)
{
if (right[i].Length < 2)
return false;
string[] tmp = right[i].Split(new char[] { '-' });
for (int j = 0; j < tmp.Length; j++)
if (tmp[j].Length < 1 || !CheckEMailPart(tmp[j]))
return false;
}
return CheckOnlyLowerCaseCharacters(right[right.Length - 1]);
}

private static bool CheckEMailPart(string str)
{
if (str == null || str == "")
return false;
for (int i = 0; i < str.Length; i++)
if (ValidEMailCharacters.IndexOf(str[i]) < 0)
return false;
return true;
}
private static bool CheckOnlyLowerCaseCharacters(string str)
{
if (str == null || str == "")
return false;
for (int i = 0; i < str.Length; i++)
if (CharactersLowerCase.IndexOf(str[i]) < 0)
return false;
return true;
}

#endregion



}
}


bu kısım ilgili class yapısı . Peki bu class ı nasıl kullacağız.
öncelikle
using ExtensionMethods;
eklememiz gerekmektedir.

string str = "aaq@aa.com";

if (str.CheckEMail())
{
//Doğru ise bunu yap
}
else
{
//yanllış ise bunu yap
}

şeklinde kullanabiliriz.

Bir sonraki yazımda görüşmek üzere ....
Sevgiyle Kalın

Oğuzhan KIVRAK

11 Mart 2008 Salı

Giriş

Paylaşımın, gelişen insanlık için kaçınılmaz bir gereksinim olduğu günümüzde, bu platform bize bu imkanı sunacaktır.
Bilginin üretilmesi ve yeni fikirlere ışık tutması açısından varolan bilginin paylaşılması gerek koşuldur. ancak yeter koşul değildir. Tam anlamıyla birşeyler olmasını istiyorsanız elinizi taşın altına koyup kendinizi geliştirmeniz gerekmektedir. Paylaşımlar sadece aklınızda ampül yanmasını sağlar.

Faydalı paylaşımlar ve arkadaşlıklar kurmak dileğiyle...

M.Zahid GÜRBÜZ