:::: MENU ::::

Delegelere ilişkin ayrıntılar

Bir delege nesnesi başlangıçta tekbir methodu tutacak şekilde yaratılır. Fakat daha sonra delege nesnesi birden fazla methodu tutacak duruma getirilebilir.

Aynı türden iki delege referansı “+” operatörüyle toplanabilir. Bu durumda yeni bir delege nesnesi yaratılır. Yeni oluşturulan delege nesnesinin method listesinde toplam iki delegenin methodları bulunur.


using System;
using System.Collections;
using System.Threading;

namespace CSD
{
	class App
	{
		public static void Main()
		{
			Proc d1 = new Proc(Sample.Foo);
			Proc d2 = new Proc(Sample.Bar);
			Proc d3;

			d3 = d1 + d2;
			d3();	// Foo ve Bar Çağırılır.
		}

		class Sample
		{
			public static void Foo()
			{
				Console.WriteLine("Foo");
			}
			public static void Bar()
			{
				Console.WriteLine("Bar");
			}
			//...
		}
	}
	delegate void Proc();
}

Toplama işleminde eğer operantlardan biri null ise yeni bir nesne yaratılmaz. Toplama işleminden null olmayan referans elde edilir. Her iki operantta null ise toplama işleminden null refereansı elde edilir.

Aynı türden iki delege referansı “-“ operatörüyle çıkartma işlemine sokulabilir. Bu durumda yeni bir delege nesnesi yaratılır. Bu yeni delege nesnesinin method listesi soldaki delege listesinin method listesinden, sağdaki delege listesinin method listesinin çıkarılması ile oluşan listedir.

Örneğin:

d1  Foo, Bar, Tar
d2  Bar
d3 = d1 – d2;
d3  Foo, Tar

Eğer sağdaki delegenin method listesi, soldaki delegede yoksa yeni bir delege nesnesi yaratılmaz. Soldaki delege referansının aynısı elde edilir.

Bir delegenin metod listesinde birden fazla metod warsa,delege metodları cagrıldıgında geri dönüş değeri olarak son metoduın geri dönüş degeri elde edilir.

Framework 2.0 ile birlikte ifadeleri kolaylastırmak için metod isimelrinden aynı parametrik yapıya sahip delege türlerine doğrudan dönüştürme kuralı eklenmiştir. Bu durumda biz bir delege referansına, doğrudan, uygun bir metodun ismini atayabiliriz.


Proc d;
d = Foo();

Bu atamayla yine bir delege nesnesi yaratılmakta ve Foo metodu yine onun içerisine yerleştirilip. Delege nesnesinin referansı d’ye atanmaktadır.

Aşağıda ki de geçerlidir


Proc d1 = Foo;
Proc d2 =;
d2 = d1 + Bar;

Bir metod ismiyle bir delege toplanıp cıkartılabilir. Bu durumda metod, bir delege yaratılarak delege nesnesinin içerisne yerleştirilir ve toplama işlemine o sokulur. Bu işleminm tamamen eşdeğeri aşağıdaki gibidir.

Bir sınıfın veri elemanı delege türünden olabilir.
Ornek:


class Sample
	{
		public Proc DoSomething;
		//...
	}

//…

public static void Main()
		{
			//...
			Sample s = new Sample();

			s.DoSomething += new Proc(Foo);
			s.DoSomething += new Proc(Bar);

			s.DoSomething();
		}


DELEGATES
1- Yalnızca Delegeler Event yapılabilir.

Bir sınıf yada yapının delege türünden veri elemanları event anahtar sözcüğ kullanılarak event yapılabilir.
Örneğin;


class Sample
		{
			public event Proc DoSomething;
		}

Event anahtar sözcüğü yalnızca delegeler ile kullanılabilir. Yani sınıfın yada yapının int, long gibi türlerden veri elemanları event yapılamaz. Yerel delege değişkenleri de event yapılamaz.

Bir delege veri elemanı event yapıldıgında dışarıya karşı kısıtlanmış olur. Event elemanlar ilgili sınıf yada yapının dışında yalnızca += yada -= operatörleriyle birlikte kullanılabilir. = operatörü ile bunlara atama yapılamaz. Bunların metodları dışarıdan çağrılamaz. Dışarıdan yalnızca += ve -= operatörleriyle kullanılabilir.

Event elemanlar sınıfın içerisinde tam bir delege olarak kullanılabilir.
Event extra bir hak vermez, kısıtlar.
Biz bir sınıfın event delge elemanını doğrudan dısarıdan cagıramayız. Delege metodları olsa olsa sınıfın kendisi tarafından cagrılabilir.


class App
		{
			public static void Main()
			{
				Sample s = new Sample();

				s.DoSomething += new Proc (Foo);
				s.Fire;
			}
		}
		class Sample
		{
			public event Proc DoSomething;
			//...
			public void Fire()
			{
				DoSomething();
			}
		}

Bir sınıfın elemanının bir event delege elemanı oldugunu gördüğümüzde aklımıza şunların gelmesi gerekir;
– bu delegeye ben yalnızca metod yerlkeştirebilrimn ve metod cıkartabilirim (+= yada -= ile)
Fakat cagırmayı ben yapamam o sınıfın kendisi yapabilir. Bir eventin delege metodlarıyla cagrılmasına, o event’ in tetiklenmesi(trigger) yada ateşlenmesi(fire) denir.

Örneğin .NET’ de bir düğme, “button” sınıfı ile temsil edilir. Button sınıfının Event Handler isimli delege türünden “Click” isimli bir event elemanı vardır. bu event elemanı düğmenin üzerine tıklandığında tetiklenmektedir.Bu durumda biz düğmeye tıklandıgında. Br metodumuzun cagrılmasını şöyle sağlayabiliriz.


                        Button b = new Button();
			b.click = new EventHandler(Foo);
			//…

Şüphesiz burada button düğmesinin cagrılması bir biçimde bu tıklanma olayını izlemektedir ve tıklama olayı gerçekleşince delege metodlarını cagırmaktadır.

X gibi bir sınıfın E isimde bir event elemanının oldugunu düünüyoruz. Bu event elemandan faydalanabilemek içn bizim şunları bilmemiz gerekir:
– hangi olay gerçekleşince bu event eleman gerçekleşecektir? (ne olacak da benim metodum cagırılacak)
– E isimli Event eleman hangi delege türündendir. Çünkü bizim buna uygun bir metoduo delegeye eklememiz gerekir.

Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.


So, what do you think ?