Kata static
kunci bisa sedikit sulit bagi pemula untuk memahami. Tujuan utamanya adalah untuk mengidentifikasi anggota kelas yang tidak termasuk dalam instance kelas apa pun, tetapi sebagai bagian dari kelas itu sendiri.
Tanpa terlalu banyak detail, C # (dan Java) secara kaku menegakkan ideal berorientasi objek bahwa semua kode dan data harus dimiliki oleh suatu objek, dan oleh karena itu terbatas dalam ruang lingkup, visibilitas dan masa pakai. Itu umumnya praktik terbaik di mana pun prinsip dasar suatu objek yang mewakili beberapa hal dunia nyata berlaku. Namun, itu tidak selalu; terkadang yang Anda butuhkan adalah fungsi atau variabel yang bisa Anda dapatkan dari mana saja dalam kode, tanpa anda harus melewati sekitar referensi ke sebuah obyek yang berisi itu, dan dengan jaminan bahwa data yang Anda cari di atau mengubah adalah persis apa yang orang yang lain berurusan dengan, dan bukan salinannya milik contoh objek yang berbeda.
Perilaku seperti itu tersedia dalam C dan C ++ dalam bentuk fungsi atau variabel "global", yang tidak dienkapsulasi dalam suatu objek. Jadi, sebagai kompromi, C # dan Java mendukung "ruang lingkup statis", titik setengah antara kode yang benar-benar global tanpa objek induk dan anggota instance lingkup terbatas.
"Anggota kode" apa pun (fungsi, properti, bidang) dinyatakan sebagai static
ruang lingkup pada baris pertama dari fungsi program main()
, dan tidak meninggalkannya sampai main()
fungsi berakhir. Dalam bahasa Inggris biasa, anggota statis ada dan dapat digunakan selama program sedang berjalan. Selain itu, anggota statis dipanggil dengan memanggil mereka sebagai anggota jenis itu sendiri, bukan anggota dari salah satu contoh dari jenis itu:
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
Hal ini membuat anggota statis dapat dilihat oleh kode apa pun yang memiliki pengetahuan tentang jenisnya, terlepas dari apakah mereka tahu atau tidak tentang satu pun instance itu.
Untuk menjawab pertanyaan Anda, manfaat utama menandai sesuatu sebagai statis adalah bahwa itu menjadi terlihat di mana pun jenisnya diketahui, terlepas dari apakah kode yang dikonsumsi memiliki atau bisa mendapatkan turunan dari objek yang mengandung. Ada juga sedikit manfaat kinerja; karena metode ini dalam lingkup statis, hanya dapat mengakses anggota statis lainnya (dari kelas yang sama atau yang lain), dan apa pun yang dilewatkan sebagai parameter. Oleh karena itu, runtime tidak harus menyelesaikan referensi ke instance saat ini dari objek yang berisi, karena biasanya harus untuk metode instance untuk memberikan informasi keadaan konteks-spesifik.
Seluruh kelas juga dapat ditandai statis; dengan melakukannya, Anda memberi tahu kompiler bahwa deklarasi kelas hanya akan terdiri dari anggota statis, dan karenanya tidak dapat dipakai. Ini adalah cara mudah untuk memastikan ada satu, dan hanya satu, salinan suatu objek di memori; buat kelas dan semua yang ada di dalamnya statis. Namun, sangat jarang bahwa ini adalah solusi terbaik untuk kebutuhan seperti itu. Dalam situasi di mana tepat satu salinan dari set data diperlukan, "singleton" biasanya dianjurkan sebagai gantinya; ini adalah kelas non-statis, yang menggunakan accessor statis dan konstruktor non-publik untuk menyediakan akses ke satu contoh itu sendiri. Secara teoritis, singleton memberikan banyak manfaat yang sama dari kelas yang sepenuhnya statis, tetapi dengan kemampuan tambahan untuk menggunakan kelas dengan cara yang berorientasi pada contoh objek.