Kelas Statik dan Anggota Kelas Statik (Panduan Pemrograman C#)
Kelas statis pada dasarnya sama dengan kelas non-statis, tetapi ada satu perbedaan: kelas statis tidak dapat dibuat. Dengan kata lain, Anda tidak dapat menggunakan operator baru untuk membuat variabel jenis kelas. Karena tidak ada variabel instans, Anda mengakses anggota kelas statis dengan menggunakan nama kelas itu sendiri. Misalnya, jika Anda memiliki kelas statik bernama UtilityClass
yang memiliki metode statik publik bernama MethodA
, Anda memanggil metode seperti yang ditunjukkan dalam contoh berikut:
UtilityClass.MethodA();
Kelas statis dapat digunakan sebagai kontainer yang nyaman untuk serangkaian metode yang hanya beroperasi pada parameter input dan tidak perlu mendapatkan atau mengatur bidang instans internal apa pun. Misalnya, di Pustaka Kelas .NET, kelas System.Math statik berisi metode yang melakukan operasi matematika, tanpa persyaratan apa pun untuk menyimpan atau mengambil data yang unik untuk instans tertentu dari kelas Math. Artinya, Anda menerapkan anggota kelas dengan menentukan nama kelas dan nama metode, seperti yang ditunjukkan pada contoh berikut.
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));
// Output:
// 3.14
// -4
// 3
Seperti halnya dengan semua jenis kelas, runtime .NET memuat informasi jenis untuk kelas statis ketika program yang mereferensikan kelas dimuat. Program tidak dapat menentukan dengan tepat kapan kelas dimuat. Namun, dijamin untuk memuat dan menginisialisasi bidangnya dan konstruktor statisnya yang dipanggil sebelum kelas dirujuk untuk pertama kalinya dalam program Anda. Konstruktor statik hanya dipanggil satu kali, dan kelas statik tetap berada di memori selama masa pakai domain aplikasi tempat program Anda berada.
Catatan
Untuk membuat kelas non-statik yang memungkinkan hanya satu instans dari kelas non-statik itu sendiri yang akan dibuat, lihat Menerapkan Database Tunggal di C#.
Daftar berikut menyediakan fitur utama dari kelas statik:
Hanya berisi anggota statik.
Tidak dapat diinstansiasi.
Disegel.
Tidak dapat berisi Konstruktor Instans.
Oleh karena itu, membuat kelas statik pada dasarnya sama dengan membuat kelas yang hanya berisi anggota statik dan konstruktor privat. Konstruktor privat mencegah kelas dibuat. Keuntungan menggunakan kelas statik adalah bahwa kompilator dapat memeriksa untuk memastikan bahwa tidak ada anggota instans yang ditambahkan secara tidak sengaja. Pengkompilasi menjamin bahwa instans kelas ini tidak dapat dibuat.
Kelas statis disegel dan oleh karena itu tidak dapat diwariskan. Mereka tidak dapat mewarisi dari kelas atau antarmuka apa pun kecuali Object. Kelas statis tidak dapat berisi konstruktor instans. Tetapi, kelas statik dapat berisi konstruktor statik. Kelas non-statik juga harus menentukan konstruktor statik jika kelas berisi anggota statik yang memerlukan inisialisasi yang penting. Untuk informasi selengkapnya, lihat Konstruktor Statik.
Contoh
Berikut adalah contoh kelas statis yang berisi dua metode yang mengonversi suhu dari Celcius ke Fahrenheit dan dari Fahrenheit ke Celcius:
public static class TemperatureConverter
{
public static double CelsiusToFahrenheit(string temperatureCelsius)
{
// Convert argument to double for calculations.
double celsius = Double.Parse(temperatureCelsius);
// Convert Celsius to Fahrenheit.
double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit;
}
public static double FahrenheitToCelsius(string temperatureFahrenheit)
{
// Convert argument to double for calculations.
double fahrenheit = Double.Parse(temperatureFahrenheit);
// Convert Fahrenheit to Celsius.
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}
}
class TestTemperatureConverter
{
static void Main()
{
Console.WriteLine("Please select the convertor direction");
Console.WriteLine("1. From Celsius to Fahrenheit.");
Console.WriteLine("2. From Fahrenheit to Celsius.");
Console.Write(":");
string? selection = Console.ReadLine();
double F, C = 0;
switch (selection)
{
case "1":
Console.Write("Please enter the Celsius temperature: ");
F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine() ?? "0");
Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
break;
case "2":
Console.Write("Please enter the Fahrenheit temperature: ");
C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine() ?? "0");
Console.WriteLine("Temperature in Celsius: {0:F2}", C);
break;
default:
Console.WriteLine("Please select a convertor.");
break;
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Example Output:
Please select the convertor direction
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:2
Please enter the Fahrenheit temperature: 20
Temperature in Celsius: -6.67
Press any key to exit.
*/
Anggota Statik
Kelas non-statik dapat berisi metode statik, bidang, properti, atau peristiwa. Anggota statis dapat dipanggil pada kelas bahkan ketika tidak ada instans kelas. Anggota statik selalu diakses dengan nama kelas, bukan nama instans. Hanya ada satu salinan anggota statik, terlepas dari berapa banyak instans kelas yang dibuat. Metode dan properti statis tidak dapat mengakses bidang dan peristiwa non-statis dalam jenis yang berisinya, dan mereka tidak dapat mengakses variabel instans objek apa pun kecuali secara eksplisit diteruskan dalam parameter metode.
Lebih khas untuk mendeklarasikan kelas non-statis dengan beberapa anggota statis, daripada mendeklarasikan seluruh kelas sebagai statis. Dua penggunaan umum bidang statis adalah menyimpan hitungan jumlah objek yang dibuat, atau untuk menyimpan nilai yang harus dibagikan di antara semua instans.
Metode statik dapat kelebihan beban tetapi tidak diganti, karena metode statik milik kelas, dan bukan milik instans kelas mana pun.
Meskipun bidang tidak dapat dinyatakan sebagai static const
, bidang const pada dasarnya statis dalam perilakunya. Bidang merupakan bagian dari jenis, bukan instans dari jenis. Oleh karena itu, const
bidang dapat diakses dengan menggunakan notasi yang sama yang ClassName.MemberName
digunakan untuk bidang statis. Tidak ada instans objek yang diperlukan.
C# tidak mendukung variabel lokal statis (yaitu, variabel yang dideklarasikan dalam cakupan metode).
Anda mendeklarasikan anggota kelas statik dengan menggunakan kata kunci static
sebelum jenis pengembalian anggota, seperti yang ditunjukkan pada contoh berikut:
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType? RunOutOfGas;
// Other non-static fields and properties...
}
Anggota statis diinisialisasi sebelum anggota statis diakses untuk pertama kalinya dan sebelum konstruktor statis, jika ada, dipanggil. Untuk mengakses anggota kelas statik, gunakan nama kelas sebagai ganti nama variabel untuk menentukan lokasi anggota, seperti yang ditunjukkan pada contoh berikut:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
Jika kelas Anda berisi bidang statik, sediakan konstruktor statik yang menginisialisasi bidang statik saat kelas dimuat.
Panggilan ke metode statis menghasilkan instruksi panggilan dalam bahasa perantara umum (CIL), sedangkan panggilan ke metode instans callvirt
menghasilkan instruksi, yang juga memeriksa referensi objek null. Namun, sebagian besar waktu perbedaan performa antara keduanya tidak signifikan.
Spesifikasi Bahasa C#
Untuk informasi selengkapnya, lihat Kelas statis, Anggota statis dan instans serta Konstruktor statis dalam Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.