Statik Sınıflar ve Statik Sınıf Üyeleri (C# Programlama Kılavuzu)
Statik sınıf temelde statik olmayan bir sınıfla aynıdır, ancak bir fark vardır: statik sınıf örneği oluşturulamaz. Başka bir deyişle, sınıf türünde bir değişken oluşturmak için yeni işleci kullanamazsınız. Örnek değişkeni olmadığından, sınıf adının kendisini kullanarak statik sınıfın üyelerine erişirsiniz. Örneğin, adlı bir genel statik yöntemi MethodA
olan adlı UtilityClass
bir statik sınıfınız varsa, aşağıdaki örnekte gösterildiği gibi yöntemini çağırırsınız:
UtilityClass.MethodA();
Statik sınıf, yalnızca giriş parametreleri üzerinde çalışan ve iç örnek alanlarını almak veya ayarlamak zorunda olmayan yöntem kümeleri için kullanışlı bir kapsayıcı olarak kullanılabilir. Örneğin, .NET Sınıf Kitaplığı'nda statik System.Math sınıf, sınıfın belirli bir örneğine Math özgü verileri depolamaya veya almaya gerek kalmadan matematiksel işlemler gerçekleştiren yöntemler içerir. Yani, aşağıdaki örnekte gösterildiği gibi sınıf adını ve yöntem adını belirterek sınıfın üyelerini uygularsınız.
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
Tüm sınıf türlerinde olduğu gibi, sınıfa başvuran program yüklendiğinde .NET çalışma zamanı statik sınıfın tür bilgilerini yükler. Program, sınıfın tam olarak ne zaman yükleneceğini belirtemez. Ancak, programınızda ilk kez sınıfa başvurulmadan önce yüklenip alanlarının başlatılması ve statik oluşturucusunun çağrılmış olması garanti edilir. Statik oluşturucu yalnızca bir kez çağrılır ve statik sınıf, programınızın bulunduğu uygulama etki alanının ömrü boyunca bellekte kalır.
Not
Yalnızca bir örneğinin oluşturulmasına izin veren statik olmayan bir sınıf oluşturmak için bkz . C# dilinde Singleton uygulama.
Aşağıdaki liste statik sınıfın ana özelliklerini sağlar:
Yalnızca statik üyeleri içerir.
Örnek oluşturulamaz.
Mühürlendi.
Örnek Oluşturucuları içeremez.
Bu nedenle statik sınıf oluşturmak temelde yalnızca statik üyeler ve özel bir oluşturucu içeren bir sınıf oluşturmakla aynıdır. Özel oluşturucu, sınıfın örneğini oluşturmasını engeller. Statik sınıf kullanmanın avantajı, derleyicinin hiçbir örnek üyesinin yanlışlıkla eklenmediğinden emin olmak için denetleyebiliyor olmasıdır. Derleyici, bu sınıfın örneklerinin oluşturulamazsınız garanti eder.
Statik sınıflar korumalıdır ve bu nedenle devralınamaz. bunlar dışında Objectherhangi bir sınıftan veya arabirimden devralamaz. Statik sınıflar örnek oluşturucu içeremez. Ancak, statik bir oluşturucu içerebilirler. Sınıf, önemsiz olmayan başlatma gerektiren statik üyeler içeriyorsa, statik olmayan sınıflar da statik bir oluşturucu tanımlamalıdır. Daha fazla bilgi için bkz . Statik Oluşturucular.
Örnek
Santigrat'tan Fahrenheit'e ve Fahrenheit'ten Santigrat'a sıcaklığı dönüştüren iki yöntem içeren bir statik sınıf örneği aşağıda verilmiştir:
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.
*/
Statik Üyeler
Statik olmayan bir sınıf statik yöntemler, alanlar, özellikler veya olaylar içerebilir. Statik üye, sınıfın hiçbir örneği mevcut olmasa bile bir sınıfta çağrılabilir. Statik üyeye her zaman örnek adıyla değil sınıf adıyla erişilir. Sınıfın kaç örneğinin oluşturulduğundan bağımsız olarak, statik üyenin yalnızca bir kopyası vardır. Statik yöntemler ve özellikler, içerdiği türdeki statik olmayan alanlara ve olaylara erişemez ve bir yöntem parametresinde açıkça geçirilmediği sürece herhangi bir nesnenin örnek değişkenine erişemez.
Statik olmayan bir sınıfı bazı statik üyeler ile bildirmek, sınıfın tamamını statik olarak bildirmekten daha tipiktir. Statik alanların iki yaygın kullanım alanı, örnek olarak kullanılan nesne sayısını tutmak veya tüm örnekler arasında paylaşılması gereken bir değeri depolamaktır.
Statik yöntemler, sınıfın herhangi bir örneğine değil sınıfına ait olduğundan aşırı yüklenebilir ancak geçersiz kılınamaz.
Bir alan olarak static const
bildirilemiyor olsa da, sabit alan temelde davranışında statiktir. Türün örneklerine değil türüne aittir. Bu nedenle, const
alanlara statik alanlar için kullanılan gösterimi kullanarak ClassName.MemberName
erişilebilir. Nesne örneği gerekmez.
C# statik yerel değişkenleri (yöntem kapsamında bildirilen değişkenler) desteklemez.
Aşağıdaki örnekte gösterildiği gibi, üyenin static
dönüş türünden önce anahtar sözcüğünü kullanarak statik sınıf üyelerini bildirirsiniz:
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...
}
Statik üyeler, statik üyeye ilk kez erişilmeden önce ve varsa statik oluşturucu çağrılmadan önce başlatılır. Statik sınıf üyesine erişmek için, aşağıdaki örnekte gösterildiği gibi üyenin konumunu belirtmek için değişken adı yerine sınıfın adını kullanın:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
Sınıfınız statik alanlar içeriyorsa, sınıf yüklendiğinde bunları başlatan bir statik oluşturucu sağlayın.
Statik yöntem çağrısı ortak ara dilde (CIL) bir çağrı yönergesi oluştururken, örnek yöntemine yapılan bir çağrı, null nesne başvurularını da denetleyen bir callvirt
yönerge oluşturur. Ancak çoğu zaman ikisi arasındaki performans farkı önemli değildir.
C# Dil Belirtimi
Daha fazla bilgi için bkz. C# Dil Belirtimi'ndeki Statik sınıflar, Statik ve örnek üyeleri ve Statik oluşturucular. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.