System.int32 | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar system.int32

LINQ ipucu – 1

15 September 2012 Yorum yapılmamış

Aldığı int parametre üzerinde çeşitli işlemler yapan ve elde ettiği sonucu geriye döndüren Hesapla() isminde bir method‘umuz var;

public int Hesapla(int Rakam)
{
	///parametre üzerinde gerçekleştirilen işlemler
	return Rakam;
}

Hesapla() method’unu çağıran aşağıdaki YapilacakIsler1() method‘u olsun;

public IEnumerable<int> YapilacakIsler1(IEnumerable<int> Rakamlar)
{
	var Sonuc = new List<int>();

	foreach (var r in Rakamlar)
	{
		Sonuc.Add(Hesapla(r));
	}

	return Sonuc;
}

YapilacakIsler1() method’unu, yield anahtar kelimesini kullanarak, IEnumerable<T> tipinde değişken oluşturmaya gerek kalmayacak şekilde değiştirebiliriz;

public IEnumerable<int> YapilacakIsler2(IEnumerable<int> Rakamlar)
{
	foreach (var r in Rakamlar)
	{
		yield return Hesapla(r);
	}
}

Hatta, LINQ Expression yazarak IEnumerable<T> tipindeki listedenin tüm elemanlarını Hesapla() method’una parametre olarak gönderebiliriz;

public IEnumerable<int> YapilacakIsler3(IEnumerable<int> Rakamlar)
{
	return Rakamlar.Select(r => Hesapla(r));
}

Son olarak, LINQ Select method’una Lambda Expression yerine, Hesapla() method’unu parametre olarak verebiliriz;

public IEnumerable<int> YapilacakIsler4(IEnumerable<int> Rakamlar)
{
	return Rakamlar.Select(Hesapla);
}

Yukarıdaki sadeleştirme devrimsel bir yenilik olmasa da, kodun daha derli-toplu olmasını sağlayacaktır.

C# 4.0 dynamic ve object farkı?

19 December 2010 3 yorum

C# 4.0 ile hayatımıza giren dynamic ve C# 1.0‘dan beri varolan object arasında ne fark var?

Önce eski dostumuz object ile başlayalım;

object anahtar kelimesi aslında System.Object sınıfının bir kısaltmasından başka birşey değildir (ki kendisi C# sınıf hiyerarşisinin en temelinde yer almaktadır)

Not : Birçoğumuzun bildiği gibi, aslında herşey object sınıfından türememektedir. bknz: Eric Lippert’in MSDN Blog yazısı

object tipinde bir değişkene, hemen hemen istediğimiz her değeri atayabiliriz. Birkaç örnek;

object Rakam = 10;
Console.WriteLine(Rakam.GetType());
/// System.Int32

Rakam = Rakam + 10;
/// Derleme zamanı hatası. Çünkü derleme anında Rakam değişkeni System.Object tipinde

Rakam = (int)Rakam + 10;
/// Hatasız atama için, unboxing yapmamız gerekiyor

Örnekte gördüğümüz gibi, Rakam değişkeninde rakamsal bir değer tutuyor olmamıza rağmen, derleyici, değişken üzerinde matematiksel işlem yapmamıza izin vermedi.

Değişken’in değerine erişebilmek için unboxing yapmak zorunda kaldık ve tip güvenliği olmadığı için çalışma zamanı hataları oluşturabilecek, zayıf bir kod ortaya çıktı.

Bir de C# 4.0 ile birlikte gelen dynamic inceleyelim;

dynamic Rakam = 10;
Console.WriteLine(Rakam.GetType());
/// object için aldığımız sonucun aynısını alıyoruz
/// System.Int32

Rakam = Rakam + 10;
/// Derleme zamanı hatası almayız, çünkü derleyici tipi çözümlemek için uğraşmaz.

Bu, object ile dynamic arasındaki en temel farktır. dynamic ile, derleyici‘ye (compiler), nesnenin tipinin sadece çalışma zamanında bilinebileceğini söylemiş oluyoruz.

Sonuçta aslında derleme zamanı için daha az kod yazıyoruz.

Fakat bu dynamic anahtar kelimesini daha az tehlikeli veya daha tehlikeli duruma getirmez.

Genelde bir sonraki soru; “dynamic ile herhangi bir method’a uygun olmayan tipte parametre gönderip, hata oluşmasını sağlayabilir miyim?” oluyor.

Basit bir örnek ile bu soruyu test edelim;

public static void AdSoyadYaz(string Ad, string Soyad)
{
    Console.WriteLine(Ad + " " + Soyad);
}

Bu method’umuzu dynamic tipindeki bir değişken ile çağıralım;

dynamic Ad = 10;
dynamic Soyad = 20;

/// Çalışma zamanı hatası almanız lazım.
AdSoyadYaz(Ad, Soyad);

Yukarıdaki kod ile, çalışma zamanında RuntimeBinderException tipinde bir hata almalısınız. Hatanın Message property’sinde; “The best overloaded method match for ‘AdSoyadYaz(string, string)’ has some invalid arguments” yazıyor olmalı.

dynamic Ad = "Engin";
dynamic Soyad = "Polat";

AdSoyadYaz(Ad, Soyad);

Gördüğünüz gibi, method’un çalıştırılması için parametre tipleri çalışma zamanında kontrol edilir, ve uygunsuz ise, RuntimeBinderException tipinde bir hata fırlatılır.

object anahtar kelimesinde ise, bu süreç derleme zamanında kontrol edilir.

object Ad = 10;
object Soyad = 20;

/// Derleme zamanı hatası almanız lazım.
AdSoyadYaz(Ad, Soyad);

object Ad = "Engin";
object Soyad = "Polat";

AdSoyadYaz((string)Ad, (string)Soyad);