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

Arşiv

Etiketlenen yazılar compiler

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);

C# Uygulamalarında XML Dokümantasyonu Kullanmak

18 February 2010 1 yorum

C# ile Uygulama Geliştirirken Yorum Satırlarını Kullanmak yazımda başladığım konuya XML Dokümantasyonunu eklemem gerekir.

Geleneksel C-tarzı yorum satırlarına ilave olarak C# geliştirilen kodların Xml Dokümantasyonunu otomatik olarak çıkartabilmek için, güçlü yorum operatörlerine sahiptir.

Bu yorum operatörleri (///) ile başlayan satırlara yazılır.

Aşağıdaki listedeki operatörler, derleyici (compiler) tarafından tanınır ve desteklenir;

<c> Tek satırı C# kodu olarak işaretler. Örneğin: <c>string AdSoyad = “Engin Polat”;</c>
<code> Birden çok satırı C# kodu olarak işaretler.
<example> İlgili satırları “örnek kod” olarak işaretler.
<exception> Exception sınıfını dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<include> Başka bir dokümantasyon dosyasından yorum ekler. (Derleyici(compiler) tarafından kontrol edilir)
<list> Dokümantasyona liste ekler.
<param> Method parametresini dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<paramref> Kelimenin parametre olduğunu işaretler. (Derleyici(compiler) tarafından kontrol edilir)
<permission> Öğeye erişim belirleyicisini dokümante eder. (Derleyici(compiler) tarafından kontrol edilir)
<remarks> Öğeye açıklama ekler.
<returns> Method’un dönüş tipini dokümante eder.
<see> Başka bir parametreye çapraz-referans ekler. (Derleyici(compiler) tarafından kontrol edilir)
<seealso> Açıklamaya “buna da bakın” parçası ekler. (Derleyici(compiler) tarafından kontrol edilir)
<summary> Öğenin kısa açıklamasını dokümante eder.
<value> Özelliği (property) tanımlar.

Örnek olması açısından, aşağıdaki Matematik sınıfını dokümantasyonu ile birlikte yazıyorum;

//Matematik.cs
namespace Engin.Polat
{
	///<summary>
	///  Engin.Polat.Matematik sınıfı.
	///  İki rakamın toplanmasına yaran
	///  Topla method'unu içerir.
	///</summary>
	public class Matematik
	{
		///<summary>
		///  İki rakamın toplanmasını sağlar.
		///</summary>
		///<example>Örnek olarak: Topla(3, 5);</example>
		///<returns>Toplama işleminin sonucu (int)</returns>
		///<param name="x">Toplama işleminin ilk rakamı</param>
		///<param name="y">Toplama işleminin ikinci rakamı</param>
		public int Topla(int x, int y)
		{
			return x + y;
		}
	}
}

Derleme sonucu oluşan Xml dokümanı aşağıdaki gibidir;

<?xml version="1.0"?>
<doc>
	<assembly>
		<name>ConsoleApplication4</name>
	</assembly>
	<members>
		<member name="T:Engin.Polat.Matematik">
			<summary>
				Engin.Polat.Matematik sınıfı.
				İki rakamın toplanmasına yaran
				Topla method'unu içerir.
			</summary>
		</member>
		<member name="M:Engin.Polat.Matematik.Topla(System.Int32,System.Int32)">
			<summary>
				İki rakamın toplanmasını sağlar.
			</summary>
			<example>Örnek olarak: Topla(3, 5);</example>
			<returns>Toplama işleminin sonucu (int)</returns>
			<param name="z">Toplama işleminin ilk rakamı</param>
			<param name="y">Toplama işleminin ikinci rakamı</param>
		</member>
	</members>
</doc>

Dikkat ederseniz, derleyici (compiler) bizim için ve elementlerini eklemiştir. Her element’i name özelliğine sahiptir ve değer olarak öğenin tam adını içerir.

Değerin ilk harfi özel bir anlam taşır;

T : Type
F : Field
M : Member