Arşiv

Etiketlenen yazılar ‘delegate’

Belirlediğiniz şablonda rastgele string üretmek

Uygulamanızda sizin belirlediğiniz şablona göre rastgele üretilmiş bir string’e ihtiyaç duyarsanız, aşağıdaki kod işinizi görebilir;

Random r = new Random();
string KullanilabilecekKarakterler = "AzByCxDwEvFuGtHsIrJqKpLoMnNmOlPkQjRiShTgUfVeWdXcYbZa1234567890";

MatchEvaluator Rastgele = delegate (Match m) {
	return KullanilabilecekKarakterler[r.Next(KullanilabilecekKarakterler.Length)].ToString();
};

Console.WriteLine(Regex.Replace("XXXX-XXXX-XXXX-XXXX", "X", Rastgele)); /// Lv2U-jHsa-TUep-NqKa
Console.WriteLine(Regex.Replace("Şifreniz : XXXX", "X", Rastgele)); /// Şifreniz : w6G0
Console.WriteLine(Regex.Replace("XXX.XXX-XX/XX", "X", Rastgele)); /// Fu8.c3Y-xT/6P
Console.WriteLine(Regex.Replace("XXXXXX", "X", Rastgele)); /// 8cPD2y

C# String Dizisini String Uzunluğuna Göre Sıralama

C# ile string dizisini elemanların uzunluğuna göre sıralama için aşağıdaki kod kullanılabilir;

private IList<string> SortStringLength(IList<string> arrString)
{
	string[] tmpString = arrString.ToArray<string>();
	Array.Sort(tmpString, new Comparison<string>(delegate(string str1, string str2)
	{
		if (str1 == null && str2 == null)
			return 0; ///iki değişkende null
		else if (str1 == null)
			return -1; ///birinci değişken null
		else if (str2 == null)
			return 1; ///ikinci değişken null
		else
		{
			if (str1.Length < str2.Length)
				return -1; ///birinci değişken daha kısa
			else if (str1.Length > str2.Length)
				return 1; ///ikinci değişken daha kısa
			else
				return str1.CompareTo(str2); ///iki değişken aynı uzunlukta, alfabetik sıralama yapılıyor
		}
	}));

	return tmpString;
}
string[] OrnekDizi = { "333", null, "1", "22", "12", "4444" };
OrnekDizi = (string[])SortStringLength(OrnekDizi);

foreach (string s in OrnekDizi)
    Console.WriteLine(s);

// Console Çıktısı:
// [null]
// 1
// 12
// 22
// 333
// 4444

Bu kodu kullanarak sıraladığınız string dizisinde, elemanlar önce uzunluklarına göre sıralanacaktır. Aynı uzunlukta olan elemanlar ise alfabetik dizilime göre sıralanacaktır.

C# Partial Method Desteği

C# 3.0 ile gelen partial keyword’u sayesinde partial class tanımlayabiliyoruz.

partial keyword’unun pek bilinmeyen bir kullanım alanı ise method‘lardır.

partial class tanımlayabildiğimiz gibi partial method‘da tanımlayabiliyoruz.

partial class‘ları tanımlamamızdaki en büyük fayda, kod üreticiler olmuştur. partial method tanımlamanın güzelliği de işte burada. Bir kod üreticisi ile otomatik olarak kod ürettirirken, partial method‘lar ürettirebiliriz.

Eğer üretilmiş partial method‘u uygulamazsanız, ilgili partial method‘u çağıran kod parçaları hata vermiyor.

Basitçe, uygulanmamış partial method çağrıları derleme (compile) sırasında yok sayılıyor.

Ama partial method‘lar için bazı kısıtlamalar ve kurallar var;

  • partial method’ların geri dönüş tipi herzaman void olmalıdır
  • partial method’lar out parametreler alamazlar, ama ref parametreler alabilirler
  • partial method’lar extern olamazlar
  • partial method’lar erişim belirleyici alamazlar, çünkü herzaman private erişim belirleyicisine sahiptirler
  • partial method’lar virtual olamazlar
  • partial method’lar static olabilir
  • partial method’lar generic olabilir
  • partial method’lara delegate bağlanamaz, çünkü partial method’un çalışma zamanında (runtime) var olacağı garanti değildir

Bu bilgilerden sonra örnek bir class yazalım;

public partial class DataAccessLayer
{
	partial void ResetConnection();
}

public partial class DataAccessLayer
{
	partial void ResetConnection()
	{
		///Connection'ı resetleyen kod
	}

	public void Reset()
	{
		ResetConnection();
	}
}

Gördüğünüz gibi, Reset() isminde public bir method yazmam gerekti. Çünkü, ResetConnection() method‘u partial olduğu için private erişim belirleyicisine sahip.

Eğer yukarıdaki kodun exe/dll dosyasına ILDASM tool’u bakarsak, DataAccessLayer.ResetConnection() private method’unu ve Reset() method‘u içerisinde bu method’u çağıran kod parçasını görürüz.

Eğer ResetConnection() method’unu uyguladığımız kod parçasını sildikten sonra, ILDASM ile bakarsak, DataAccessLayer.ResetConnection() private method’unun bulunmadığını ve Reset() method’unda bu method’u çağıran kod parçası olmadığını görürüz.

Böylece çalışma zamanı hatası almayız.

Bu kodda ne yanlış var? – 2

15 Ocak 2010 engin.polat 2 comments

Aşağıdaki kod parçasını çalıştıralım. Sifir isimli değişkenin değerine baktığımızda 0 olduğunu görüyoruz.

List arrListe = new List(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
int Sifir = arrListe.Find(
	delegate(int i) {
		return i == 0;
	}
);

Listede 0 değeri yok!. Neden sonuç 0 dönüyor? Bu kodu nasıl düzeltebiliriz?

Categories: C#, Programlama Tags: , , , , , , , ,

C# ile Ping Uygulaması

Windows komut satırından çağırabileceğiniz ping komutu ile kendi bilgisayarınızdan, networkünüzde bulunan diğer bilgisayarlara Ping atabilirsiniz.

Bazı durumlarda uygulamamıza ping yeteneği eklememiz gerekebilir. (Sunuculara erişilemediği anı yakalayıp, ilgili birimleri uyarmak gibi) Bu yazımda C# ile ping uygulaması yazacağız.

Hemen ekran görüntüsü ile başlayalım;

İlk başlangıç noktamız, MSDN’de şu sayfadan bilgilerine erişebileceğiniz Ping class’ı olacak. Ping class’ı, framework içerisinde System.Net.NetworkInformation namespace’i içerisinde yeralır.

private void btnPing_Click(object sender, EventArgs e)
{
	Ping p = new Ping();
	Timer t = new Timer() { Interval=1000 };
	t.Start();
	t.Tick += delegate(object _s, EventArgs _e) {
		PingReply pr = p.Send(txtAdres.Text);
		txtSonuc.Text += string.Format("Sonuç: {0}, {1} -> {2} ms.{3}", pr.Status.ToString(), pr.Address.ToString(), pr.RoundtripTime.ToString(), Environment.NewLine);
	};
}

Ping butonunun Click olayında, Ping ve Timer class’larından birer örnek oluşturuyoruz. Timer nesnesinin Tick olayında, Ping nesnesinin Send() method’unu çağırıyoruz, dönen sonucu PingReply sınıfında bir değişkene atıyoruz ve txtSonuc Textbox‘ında gösteriyoruz.

Uygulamanın kaynak kodlarını buradan indirebilirsiniz.

Kısa Sınav – 2

18 Kasım 2009 engin.polat 2 comments

Windows Forms projenizde, birkaç saniye süren bir işlem yaptırmanız lazım.

Kullanıcı Arayüzü (User Interface – UI), bu işlem süresince sürekli olarak güncellenmeli ve işlemin durumunu bir progressbar nesnesinde göstermeli.

Geliştirme bakımından en az uğraş ile bu görevi nasıl yerine getirirsiniz?

  • Asenkron Delegate pattern kullanırım
  • BackgroundWorker component’i kullanırım
  • Thread class’ını kullanırım
  • İşlemi başlatır, Timer nesnesi ile periyodik olarak ProgressBar’ı güncellerim

Sorunun doğru cevabı için; Devamını Oku…