Uzun bir aradan sonra hepinize yeniden merhaba!

Bu kısa derste C#‘taki property‘lere değineceğim. Ben kendi kodlarımda zaman zaman property’lerden faydalanıyorum. Buna ilaveten, incelediğim bazı hazır kodlarda da bol bol property kullanıldığını görüyorum. Property dediğimiz kavramı tanıdığınız zaman umuyorum ki bu kodları okumakta daha az zorluk çekeceksiniz.

O halde başlıyoruz…

NOT: Property’lerin Javascript versiyonu bana C# kadar güzel görünmedi, o yüzden bu dersi sadece C# içinmiş gibi varsayabilirsiniz.

Property dediğimiz şey değişkenlere çok benzemekte. İsterseniz çok basit bir property örneği görelim ve bu örnek üzerinden ilerleyelim:

private int saglik = 100;

public int Saglik
{
	get
	{
		return saglik;
	}
	set
	{
		saglik = value;
	}
}

Bu örnek kodumuzdaki property’miz “Saglik” (büyük harfle başlayan). Syntax biraz garip gelebilir, başta bana da garip gelmişti. Bir property’i tanımlarken tıpkı değişkenlerdeki gibi property’nin erişilebilirliğini (public), türünü (int) ve ismini (Saglik) giriyoruz. Burada illa “saglik”ın ilk harfini büyültmek zorunda değiliz, istersek property’e “Health” adını da verebiliriz.

Property’lerin içine girebileceğimiz sadece ve sadece iki fonksiyon bulunmakta: get ve set fonksiyonları. Ne zaman ki “Saglik” property’sine bir yerlerden erişmeye çalışırız, işte o zaman get fonksiyonu çağrılır. Ne zaman ki “Saglik” property’sine bir değer vermeye çalışırız, işte o zaman da set fonksiyonu çağrılır. Örneğin “Saglik = 50;” kodu yazacak olursam Saglik property’sinin set fonksiyonu çağrılır ve “value” dediğimiz özel değişken değer olarak 50 alır. Bu değer de “saglik = value;” kodu vasıtasıyla saglik’a aktarılır. Eğer ki “Debug.Log( Saglik );” yazacak olursam da Saglik property’sinin get fonksiyonu çağrılır ve “return saglik;” kodu vasıtasıyla “saglik” değişkeninde depolanan değer döndürülür.

Şu anda bu property’e hiç gerek yoktu, niye sadece saglik’i public yapmadık diyebilirsiniz. Dediğiniz şeyde tamamen haklısınız. Bu örnek için aslında bir property’e ihtiyacımız yoktu; direkt saglik’i public yapıp onun değeriyle oynayabilirdik. Ancak gelin şimdi şu örneğe bakalım:

public int tecrube = 0;

public int Seviye
{
	get
	{
		return tecrube / 100;
	}
}

Property’lerde olup da değişkenlerde olmayan başlıca iki özelliği bu örnekte görüyoruz:

1) Seviye property’mizin bir set fonksiyonu yok ama sadece get fonksiyonu var. Bu da demek oluyor ki kodlarımızda “Debug.Log( Seviye );” yazıp get fonksiyonunu çağırabiliriz ancak “Seviye = 10;” yazamayız zira Seviye property’sinin set fonksiyonu yok. Eğer ki bir değişkenin sadece değerini okumak istiyor ancak bu değerin elle değiştirilmesini istemiyorsanız property’ler sizin için biçilmiş kaftan. Eğer ki get fonksiyonunu silip set fonksiyonu yazsaydık bu sefer de “Debug.Log( Seviye );” yapamaz ancak “Seviye = 10;” yapabilirdik.

2) get fonksiyonunun gerçekten de bir fonksiyon olduğu dikkatinizi çekti mi? Direkt “return tecrube;” demek yerine “return tecrube / 100;” yazdık. Eğer ki her 100 tecrübe puanı kazandığımızda seviye atlıyorsak artık bu seviyeye erişmek için elimizde çok pratik bir property’miz bulunmakta! Eğer dilersek get fonksiyonunun içine istediğimiz kadar satır ekleyebilir, bu fonksiyon içinde başka fonksiyonları da çağırabiliriz. Çünkü dediğim gibi; get ve set gerçek birer fonksiyon gibi görev yapmakta.

Biraz daha gelişmiş bir örnekle dersimizi bitirelim. Diyelim ki bir GameObject‘in Rigidbody‘sine her seferinde GetComponent(Rigidbody) şeklinde erişmek yerine direkt rigidbody şeklinde erişmek ve eğer o sırada objede Rigidbody yoksa otomatik olarak bir Rigidbody eklemek istiyorsunuz. O halde şöyle bir property kullanabilirsiniz:

// Degisken
private Rigidbody rigidbodyComponenti;

// Property
public Rigidbody rigidbody
{
	// rigidbody'e erismeye calisinca get cagrilir
	get
	{
		// Eger ki rigidbodyComponenti'nin bir degeri yoksa
		if( rigidbodyComponenti == null )
		{
			// Rigidbody component'ini rigidbodyComponenti degiskeninde depola
			rigidbodyComponenti = GetComponent<Rigidbody>();
			
			// Objede Rigidbody yoksa bir tane ekle
			if( rigidbodyComponenti == null )
				rigidbodyComponenti = gameObject.AddComponent<Rigidbody>() as Rigidbody;
		}
		
		// rigidbodyComponenti'nin degerini (yani Rigidbody component'ini) dondur
		return rigidbodyComponenti;
	}
}

Gördüğünüz gibi get fonksiyonu birden çok satırdan oluşabiliyor ve de bu fonksiyon içerisinde başka fonksiyonları çağırabiliyoruz.

Umarım ders faydalı olmuştur. Bir sonraki derste görüşmek dileğiyle!

Yorumlar
  1. Mehmet diyor ki:

    Konuyla ilgili ek bir not da ben yazayım rast gelmişken.

    GetComponent kullanımı masraflı bir metot olduğundan bir property içinde GetComponent kullanmak çok verimli bir çözüm değil. Bunun yerine GetComponent ile alınan obje bir referansa atanmalı ve o referans üzerinden property içinde erişim sağlanmalı. Özellikle program içerisinde sık kullanılan property lerde, bilhassa mobilde performans açısından önem arz ediyor bu durum.

  2. Hasan Aktaş diyor ki:

    Yasir Hocam İyi Günler. araştırdım ama pek bilgi bulamadım. bir futbol oyunu geliştiriyorum mobil için butona bastığımda karakter şut çekebiliyor fakat ben butona ne kadar süre basarsa topun o kadar hızlı gitmesini istiyorum. butona basılan süreyi nasıl kullanabilirim kod içerisinde ? Bilgilendirirsen veya Bilen bir arkadaş bilgilendirirse sevinirim.

    İyi Günler.

    • yasirkula diyor ki:

      UI’da Event Trigger component’i var; o component’e OnPointerDown event’i eklerseniz UI elemanına basınca bu event çalışır. OnPointerUp event’i eklerseniz de UI elemanından elinizi çekince bu event çalışır. OnPointerDown’da bir timer çalıştırıp OnPointerUp’ta bu timer’ı durdurabilirsiniz. Böylece butona ne kadar süre basılı tutulduğunu hesaplayabilirsiniz.

  3. zayutz diyor ki:

    abi c#’ı en iyi nasıl ve nerden öğrenebilirim

  4. Veli diyor ki:

    Bir sorum olacak ben seviye sistemi yapmaya çalışıyorum istediğim mantık şu şekilde ilk şevel 100exp ikinci level 150exp gibi her level daha fazla exp isteyecek ama 60 level için if döngüsü kurmak saçma olur bunu for ile gerçekleştirebilirmiyiz ?

  5. ahmet diyor ki:

    Hocam Merhabalar;Bir sorum olacaktı.Ekrandaki nesnenin içindeki sesin 10 saniyede bir kendiliğinden tekrar etmesini istiyorum.Nasıl yapabilirim acaba.Teşekürler

    • yasirkula diyor ki:

      Şunun gibi birşey işe yarayabilir (js):

      private var aSource : AudioSource;

      function Start()
      {
      aSource = GetComponent(AudioSource);
      InvokeRepeating(“Tekrarla”,10f,10f);
      }

      function Tekrarla()
      {
      aSource.Stop();
      aSource.Play();
      }

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s