C# Statics

Fatih Altuntaş
3 min readOct 16, 2020

Değişkenler(variables) ve yöntemler(method) gibi statik üyeler, bir sınıfın(class) tüm örnekleri(instances) arasında paylaşılan üyelerdir. Ayrıca, üye değişkenler(static members), önce classın bir nesnesini(object) başlatmadan(instantiating) doğrudan bir sınıftan erişilebilir.

Normalde static memberslar bir classın her nesnesi için benzersizdir. Bir classın her nesnesi aynı değişkenlere sahipken, her birinin kendi değerleri vardır. Ancak statik değişkenlerle, classın her nesnesi aynı değerle aynı değişkene sahiptir. Bu nedenle, bir statik değişkenin değerini tek bir yerde değiştirmek, diğerlerinin hepsinde bir değer değişikliğine neden olacaktır.

Düşman sınıfının kaç nesnesinin instantiat edildiğini bilmek istediğimizi farz edelim. Bunu yapmanın kolay bir yolu, enemyCount adlı statik bir member variable kullanmaktır. Bir membera “statik” anahtar sözcüğünü koyarak, bunun statik olduğunu ve dolayısıyla classın herhangi bir örneğine(instance) değil, classın kendisine ait olacağını bildirmiş olursunuz. Daha sonra yapmanız gereken tek şey, bir düşman nesnesi oluşturulduğunda değişkeni artırmaktır. Her nesne aynı değişkeni artırdığından, yaratılan tüm düşmanların toplam sayısını içerecektir.

public class Enemy
{
//Statik değişkenler, bir sınıfın tüm
//örnekleri arasında paylaşılır.
public static int enemyCount = 0;

public Enemy()
{
//Bu classdan kaç tane nesnenin yaratıldığını
//bilmek için statik değişkeni artırın.
enemyCount++;
}
}

Statik değişkene erişmek de oldukça basittir. Burada, birkaç düşman yaratan bir Game sınıfımız var. Kaç tane Enemy yaratıldığını bulmak için, class adını ve nokta operatörünü kullanarak enemyCount statik değişkenine erişmemiz yeterlidir.

public class Game
{
void Start ()
{
Enemy enemy1 = new Enemy();
Enemy enemy2 = new Enemy();
Enemy enemy3 = new Enemy();

//Class adını ve nokta operatörünü kullanarak
//statik bir değişkene erişebilirsiniz.
int x = Enemy.enemyCount;
}
}

Bu işlem, GameObject componentleri olması amaçlanan scriptler için de çalışır. Örneğin, bir Sahnede yaratılan oyuncuların sayısını bilmek istersek, bir Player script componenti oluşturabiliriz.

Bu scriptte, statik bir playerCount değişkeni tanımlayabiliriz ve Start () metodunda onu artırabiliriz. Şimdi, bu script eklenmiş bir GameObject oluşturulduğunda, toplam playerCount artar.

public class Player : MonoBehaviour 
{
//Statik değişkenler, bir sınıfın tüm
//örnekleri arasında paylaşılır.
public static int playerCount = 0;

void Start()
{
//Bu classdan kaç tane nesnenin yaratıldığını
//bilmek için statik değişkeni artırın.
playerCount++;
}
}

Başka bir Script componentinde, bu statik değişkene scriptin adını ve nokta operatörünü kullanarak erişebiliriz.

public class PlayerManager : MonoBehaviour 
{
void Start()
{
//Class adını ve nokta operatörünü kullanarak
//statik bir değişkene erişebilirsiniz.
int x = Player.playerCount;
}
}

Tıpkı statik değişkenler gibi, statik metodlar da classın belirli bir nesnesi değil, classa ait olan metodlardır. Bunun çok basit bir örneği, Utilities adında bir classınız varsa ve classın içinde, iki sayıyı birbirine eklemenin sonucunu döndüren Add () adında statik bir metod olması olabilir. Add () metodunun statik olduğunu, önündeki “static” anahtar sözcüğünden anlayabilirsiniz.

public static class Utilities 
{
//Statik bir metod, bir classın nesnesi olmadan çağrılabilir.
//Statik metodların statik olmayan değişkenlere
//erişemediğini unutmayın
public static int Add(int num1, int num2)
{
return num1 + num2;
}
}

Artık başka bir classda, yalnızca classın adını ve nokta operatörünü kullanarak Add () metodunu çağırabilirsiniz. Statikleri kullanmak için classın bir nesnesini instantiate etmenize gerek yoktur.

public class UtilitiesExample : MonoBehaviour 
{
void Start()
{
//You can access a static method by using the class name
//and the dot operator.
int x = Utilities.Add (5, 6);
}
}

Farkında olmadan da static metodlar kullnmışsınızdır. Unity’de Input ile çalıştığınız bir zamanı düşünün. Input.GetAxis(), Input.GetKey(), Input.GetButton() vs. hepsi static metodlardır. Statik olduklarını, onları kullanmak için Input classının bir nesnesini instantiate etmediğinizden anlayabilirsiniz.

Aslında, Unity’de çok çeşitli yardımcı programlar ve özellikler sağlayan birçok statik metod vardır.

Statik metodların içinde statik olmayan sınıf değişkenleri kullanamayacağınızı unutmamak önemlidir. Statik bir metodun classa ait olduğunu, statik olmayan değişkenlerin ise classın örneklerine(instances) ait olduğunu unutmayın.

Ayrıca tüm bir classı statik yapabilirsiniz. Bunu yapmak için, class adının önüne “statik” anahtar sözcüğünü koymanız yeterlidir.

Sonuç, classın statik hale gelmesi ve bunun örneklerinin oluşturulamamasıdır. Input classı gibi, tamamen statik değişkenlerden ve metodlardan oluşan bir class yapmak istiyorsanız bu yararlıdır.

Kaynakça: Unity Learn-Statics

--

--