Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 statis bernama UtilityClass
yang memiliki metode statis 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 statis System.Math berisi metode yang melakukan operasi matematika, tanpa persyaratan untuk menyimpan atau mengambil data yang unik untuk instans Math kelas tertentu. Artinya, Anda menerapkan anggota kelas dengan menentukan nama kelas dan nama metode, seperti yang ditunjukkan dalam 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 akan memuat, menginisialisasi bidangnya, dan memanggil konstruktor statisnya sebelum kelas dirujuk untuk pertama kalinya dalam program Anda. Konstruktor statis hanya disebut satu kali, dan kelas statis tetap berada dalam memori selama masa pakai domain aplikasi tempat program Anda berada.
Nota
Untuk membuat kelas non-statis yang hanya memungkinkan satu instans itu sendiri dibuat, lihat Menerapkan Singleton di C#.
Daftar berikut ini menyediakan fitur utama kelas statis:
Hanya berisi anggota statis.
Tidak dapat diinstansiasi.
Telah disegel.
Tidak dapat berisi Konstruktor Instans.
Oleh karena itu, membuat kelas statis pada dasarnya sama dengan membuat kelas yang hanya berisi anggota statis dan konstruktor privat. Konstruktor privat mencegah suatu kelas diinstansiasi. Keuntungan menggunakan kelas statis adalah pengompilasi 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. Namun, mereka dapat berisi konstruktor statis. Kelas non-statis juga harus menentukan konstruktor statis jika kelas berisi anggota statis yang memerlukan inisialisasi non-sepele. Untuk informasi selengkapnya, lihat Konstruktor Statis.
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: {F:F2}");
break;
case "2":
Console.Write("Please enter the Fahrenheit temperature: ");
C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine() ?? "0");
Console.WriteLine($"Temperature in Celsius: {C:F2}");
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 Statis
Kelas non-statis dapat berisi metode statis, bidang, properti, atau peristiwa. Anggota statis dapat dipanggil pada kelas bahkan ketika tidak ada instans kelas. Anggota statis selalu diakses oleh nama kelas, bukan nama instans. Hanya satu salinan anggota statis yang ada, 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 umum untuk mendeklarasikan kelas non-statis dengan beberapa anggota-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 statis dapat dibebani berlebih tetapi tidak bisa ditimpa, karena merupakan bagian dari kelas, dan bukan untuk instans kelas apa pun.
Meskipun bidang tidak dapat dinyatakan sebagai static const
, bidang const pada dasarnya statis dalam perilakunya. Ini milik jenis, bukan pada instans dari jenis tersebut. Oleh karena itu, bidang const
dapat diakses dengan menggunakan notasi ClassName.MemberName
yang sama yang digunakan untuk bidang statis. Tidak diperlukan instans objek.
C# tidak mendukung variabel lokal statis (yaitu, variabel yang dideklarasikan dalam cakupan metode).
Anda mendeklarasikan anggota kelas statis dengan menggunakan kata kunci static
sebelum jenis pengembalian anggota, seperti yang ditunjukkan dalam 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 statis, gunakan nama kelas alih-alih nama variabel untuk menentukan lokasi anggota, seperti yang ditunjukkan dalam contoh berikut:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
Jika kelas Anda berisi bidang statis, berikan konstruktor statis yang menginisialisasinya saat kelas dimuat.
Panggilan ke metode statis menghasilkan instruksi panggilan dalam bahasa perantara umum (CIL), sedangkan panggilan ke metode instans menghasilkan instruksi callvirt
, 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#.