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şlecini 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ı MethodAbir genel statik yöntemi 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 herhangi bir iç örnek alanı alması veya ayarlaması gerekmeyen yöntem kümeleri için uygun 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. Başka bir ifadeyle, 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 statik sınıfın tür bilgileri .NET çalışma zamanı tarafından yüklenir. Program, sınıfın tam olarak ne zaman yükleneceğini belirtemez. Ancak, sınıfına programınızda ilk kez başvurulmadan önce yüklenip alanlarının başlatılması ve statik oluşturucusunun çağrılması 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:

Bu nedenle statik sınıf oluşturmak temel olarak yalnızca statik üyeleri ve özel oluşturucuyu 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 yanlışlıkla hiçbir örnek üyesinin eklenmediğinden emin olmak için denetleyebilmektir. Derleyici, bu sınıfın örneklerinin oluşturulamayacağını 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

Burada, sıcaklığı Santigrat'tan Fahrenheit'e ve Fahrenheit'ten Santigrat'a dönüştüren iki yöntem içeren bir statik sınıf örneği 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 oluşturulmamış olsa 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, statik olmayan alanlara ve olaylara kendi içeren türlerinde erişemez ve bir yöntem parametresinde açıkça geçirilmediği sürece herhangi bir nesnenin örnek değişkenine erişemezler.

Bir sınıfın tamamını statik olarak bildirmek yerine bazı statik üyelere sahip statik olmayan bir sınıf bildirmek daha tipik bir durumdur. Statik alanların iki yaygın kullanımı, örneklenmiş nesne sayısını tutmak veya tüm örnekler arasında paylaşılması gereken bir değeri depolamaktır.

Statik yöntemler aşırı yüklenebilir, ancak sınıfın herhangi bir örneğine ait olmadığından geçersiz kılınamaz.

Bir alan olarak static constbildirilemiyor olsa da , sabit alan temelde davranışında statiktir. Türün örneklerine değil türüne aittir. Bu nedenle, const alanlara ClassName.MemberName statik alanlar için kullanılan gösterimi kullanarak 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 başlatılır 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 statik bir oluşturucu sağlayın.

Statik yöntem çağrısı, Microsoft ara dilinde (MSIL) bir çağrı yönergesi oluştururken, örnek yöntemine yapılan ç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'ndekiStatik 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.

Ayrıca bkz.