static
Yenilere kavramak için anahtar kelime biraz zor olabilir. Birincil amacı, bir sınıf üyesini sınıfın herhangi bir örneğine ait değil, sınıfın kendisine ait olarak tanımlamaktır.
Çok fazla ayrıntıya girmeden, C # (ve Java), tüm kod ve verilerin bir nesneye ait olması gerektiği için nesne yönelimli ideali sıkı bir şekilde zorlar ve bu nedenle kapsam, görünürlük ve ömürle sınırlıdır. Bu, gerçek dünyayı temsil eden bir nesnenin temel ilkesinin geçerli olduğu yerlerde genellikle en iyi uygulamadır. Ancak, her zaman değil; bazen ihtiyacınız olan şey, onu içeren bir nesneye referans göndermenize gerek kalmadan, kodun herhangi bir yerinden alabileceğiniz bir işlev veya değişkendir ve baktığınız veya değiştirdiğiniz verilerin tam olarak herkesin başka bir nesnenin farklı bir örneğine ait olan bir kopyasıyla ilgilenmemektedir.
Bu davranış C ve C ++ 'da bir nesnede kapsüllenmemiş "global" fonksiyon veya değişken formunda mevcuttu. Bu nedenle, bir uzlaşma olarak, C # ve Java "statik kapsam" ı destekler, üst nesne olmadan gerçekten global kod ile sınırlı kapsam örneği üyeleri arasında bir yarı noktadır.
Herhangi bir "kod üyesi" (işlev, özellik, alan) static
, programın main()
işlevinin ilk satırından itibaren kapsam içine girer ve main()
işlev sonlanıncaya kadar bırakmaz . Basit İngilizce'de, statik bir üye vardır ve program çalıştığı sürece kullanılabilir. Ayrıca, statik üyeler, bu türün herhangi bir örneğinin üyesi olarak değil, türün kendisinin üyesi olarak çağrılarak çağrılır:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
Bu, statik üyeleri, herhangi bir örneği hakkında bilgi sahibi olsun ya da olmasın, tür bilgisi olan herhangi bir kod için görünür kılar.
Sorunuzu yanıtlamak için, bir şeyi statik olarak işaretlemenin birincil yararı, tüketen kodun içerdiği nesnenin bir örneğine sahip olup olmadığına bakılmaksızın, türün kendisinin bilindiği her yerde görünür hale gelmesidir. Ayrıca hafif bir performans avantajı vardır; yöntem statik kapsamda olduğundan, yalnızca diğer statik üyelere (aynı sınıftan veya başkalarından) ve parametre olarak iletilen her şeye erişebilir. Bu nedenle, çalışma zamanının, normalde bağlama özgü durum bilgisi sağlamak için bir örnek yöntemi için gerekli olacağı için, içerilen nesnenin geçerli örneğine herhangi bir başvuruyu çözümlemesi gerekmez.
Sınıfların tamamı statik olarak da işaretlenebilir; bunu yaparak derleyiciye sınıf bildiriminin yalnızca statik üyelerden oluşacağını ve dolayısıyla somutlaştırılamayacağını söylersiniz. Bu, bellekteki bir nesnenin yalnızca bir kopyasının olmasını sağlamanın kolay bir yoludur; sınıfı ve içindeki her şeyi statik hale getirin. Bununla birlikte, bunun böyle bir ihtiyaca en iyi çözüm olması çok nadirdir. Bir veri kümesinin tam olarak bir kopyasının gerekli olduğu bir durumda, bunun yerine "singleton" genellikle savunulur; bu, kendi başına tek bir örneğe erişim sağlamak için statik erişimci ve genel olmayan bir kurucu kullanan statik olmayan bir sınıftır. Teorik olarak, bir singleton, tamamen statik bir sınıfın aynı faydalarını sağlar, ancak sınıfı örnek tabanlı, nesne yönelimli bir şekilde kullanma özelliği de eklenir.