Aracılığıyla paylaş


Özellikleri Kullanma (C# Programlama Kılavuzu)

Özellikler hem alanların hem de yöntemlerin yönlerini birleştirir. Bir nesnenin kullanıcısına bir özellik bir alan gibi görünür; özelliğine erişmek için aynı söz dizimi gerekir. Bir sınıfın uygulayıcısı için bir özellik, bir get erişimciyi ve/veya bir set veya bir init erişimciyi temsil eden bir veya iki kod bloğudur. Erişimcinin get kod bloğu, özellik okunduğunda yürütülür; özelliğe bir değer atandığında veya set erişimcisi için init kod bloğu yürütülür. set erişimcisi olmayan bir özellik, salt okunur olarak kabul edilir. Erişimcisi olmayan bir get özellik sadece yazılabilir olarak kabul edilir. Her iki erişimciye (okuma ve yazma) sahip bir özellik okunabilir-yazılabilir bir özelliktir. init erişimcisi kullanarak, nesne başlatma sırasında özelliğin ayarlanmasına izin verebilir ve aksi takdirde salt okunur kalmasını sağlayabilirsiniz, bu da set erişimcisinin yerine geçer.

Alanlardan farklı olarak, özellikler değişken olarak sınıflandırılmamıştır. Bu nedenle, bir özelliği ref veya out parametresi olarak geçiremezsiniz.

Özelliklerin birçok kullanımları vardır:

  • Bir değişikliğe izin vermeden önce verileri doğrulayabilirler.
  • Verilerin veritabanı gibi başka bir kaynaktan alındığı bir sınıftaki verileri saydam bir şekilde kullanıma sunar.
  • Veriler değiştirildiğinde, olay oluşturma veya diğer alanların değerini değiştirme gibi bir eylem gerçekleştirebilirler.

Özellikler, alanın erişim düzeyi, ardından özelliğin türü, ardından özelliğin adı ve ardından bir get erişimci ve/veya set erişimci bildiren bir kod bloğu belirtilerek sınıf bloğunda bildirilir. Örneğin:

public class Date
{
    private int _month = 7;  // Backing store

    public int Month
    {
        get => _month;
        set
        {
            if ((value > 0) && (value < 13))
            {
                _month = value;
            }
        }
    }
}

Bu örnekte, Month bir özellik olarak bildirilir, böylece set erişimcisi Month değerinin 1 ile 12 arasında ayarlandığından emin olabilir. özelliği, Month gerçek değeri izlemek için özel bir alan kullanır. Bir özelliğin verilerinin gerçek konumu genellikle özelliğin "yedekleme deposu" olarak adlandırılır. Özelliklerin özel alanları bir yedekleme deposu olarak kullanması yaygındır. Alan, yalnızca özellik yöntemi çağrılarak değiştirilebilmesi için "private" olarak işaretlenmiştir. Genel ve özel erişim kısıtlamaları hakkında daha fazla bilgi için bkz . Erişim Değiştiricileri. Otomatik olarak uygulanan özellikler, basit özellik bildirimleri için basitleştirilmiş söz dizimi sağlar. Daha fazla bilgi için bkz . Otomatik olarak uygulanan özellikler.

C# 13'te başlayarak, aşağıdaki örnekte gösterildiği gibi otomatik olarak uygulanan bir özelliğin erişimcisine doğrulama eklemek için alan destekli özellikleriset:

public class DateExample
{
    public int Month
    {
        get;
        set
        {
            if ((value > 0) && (value < 13))
            {
                field = value;
            }
        }
    }
}

Önemli

Anahtar field sözcük, C# 13'teki bir önizleme özelliğidir. .NET 9 kullanıyor olmalı ve <LangVersion> öğenizi preview olarak ayarlamalısınız ki field bağlamsal anahtar sözcüğünü kullanabilesiniz.

Bir field anahtar sözcük özelliğini, field adlı bir alanı olan bir sınıfta kullanırken dikkatli olmalısınız. Yeni field anahtar sözcük, bir özellik erişimcisi kapsamında field adlı bir alanı gölgeler. field değişkeninin adını değiştirebilir veya @ tanımlayıcısına field olarak başvurmak için @field belirtecini kullanabilirsiniz. Anahtar sözcüğüfield okuyarak daha fazla bilgi edinebilirsiniz.

Alıcı erişimcisi

Erişimcinin get gövdesi bir yöntemin gövdesine benzer. Özellik türünde bir değer döndürmelidir. C# derleyicisi ve Just-in-time (JIT) derleyicisi, get erişimcisini uygulamak için yaygın desenleri algılar ve bu desenleri optimize eder. Örneğin, herhangi bir hesaplama gerçekleştirmeden alan döndüren bir get erişimci büyük olasılıkla bu alanın bellek okuması için iyileştirilmiştir. Otomatik olarak uygulanan özellikler bu deseni izler ve bu iyileştirmelerden yararlanır. Ancak, derleyici derleme zamanında hangi metodun çalışma zamanında çağrılabileceğini bilmediğinden sanal get erişimci metot inline edilemez. Aşağıdaki örnekte, özel bir get alanın _namedeğerini döndüren bir erişimci gösterilmektedir:

class Employee
{
    private string _name;           // the name field
    public string Name => _name;    // the Name property
}

Bir atamanın hedefi dışında özelliğine başvurduğunuzda, özelliğin get değerini okumak için erişimci çağrılır. Örneğin:

var employee = new Employee();
//...

System.Console.Write(employee.Name); // the get accessor is invoked here

Erişimci get ifade gövdeli bir üye olmalı veya return ya da throw deyimiyle bitmelidir ve kontrol akışı erişimci gövdesi dışında devam edemez.

Uyarı

Erişimciyi kullanarak nesnenin durumunu değiştirmek genellikle kötü bir programlama stilidir get . Bu kuralın bir istisnası, bir özelliğin değerinin yalnızca ilk erişildiğinde hesaplandığı tembel değerlendirme özelliğidir.

get erişimcisi, alan değerini döndürmek veya hesaplayıp döndürmek için kullanılabilir. Örneğin:

class Manager
{
    private string _name;
    public string Name => _name != null ? _name : "NA";
}

Önceki örnekte, özelliğine Name bir değer atamazsanız, değerini NAdöndürür.

Set erişimcisi

Erişimci, set dönüş türü geçersiz olan bir yönteme benzer. Türü, özelliğin türü olan, value adında örtük bir parametre kullanır. Derleyici ve JIT derleyicisi, bir set veya init erişimcisi için ortak desenleri de tanır. Bu yaygın desenler en iyi duruma getirilmiştir ve doğrudan yedekleme alanı için bellek yazılır. Aşağıdaki örnekte, set özelliğine bir Name erişimci eklenir:

class Student
{
    private string _name;      // the name field
    public string Name         // the Name property
    {
        get => _name;
        set => _name = value;
    }
}

Özelliğine bir değer atadığınızda, set erişimci yeni değeri sağlayan bir bağımsız değişken kullanılarak çağrılır. Örneğin:

var student = new Student();
student.Name = "Joe"; // the set accessor is invoked here

System.Console.Write(student.Name); // the get accessor is invoked here

Bir value erişimcisindeki yerel değişken bildirimi için set örtük parametre adını kullanmak hatadır.

Başlatma erişimcisi

init erişimcisi oluşturma kodu, set yerine init anahtar sözcüğünü kullanmanız dışında set erişimcisi oluşturma koduyla aynıdır. Aradaki fark, init erişimcisinin yalnızca yapıcıda veya bir nesne başlatıcı kullanarak kullanılabilmesidir.

Açıklamalar

Özellikler public, private, protected, internal, protected internal veya private protected olarak işaretlenebilir. Bu erişim değiştiricileri, sınıfın kullanıcılarının özelliğine nasıl erişebileceğini tanımlar. Aynı özelliğin ve erişimcileri farklı erişim değiştiricilerine sahip olabilir. Örneğin, get, türün dışından salt okunur erişime izin vermek için public olabilir ve set, private veya protected olabilir. Daha fazla bilgi için bkz . Erişim Değiştiricileri.

Bir özellik, anahtar sözcüğü kullanılarak static statik özellik olarak bildirilebilir. Statik özellikler, sınıfın hiçbir örneği mevcut olmasa bile çağıranlar tarafından herhangi bir zamanda kullanılabilir. Daha fazla bilgi için bkz . Statik Sınıflar ve Statik Sınıf Üyeleri.

Bir özellik, sanal anahtar sözcüğü kullanılarak sanal özellik olarak işaretlenebilir. Sanal özellikler, türetilmiş sınıfların override anahtar sözcüğünü kullanarak özellik davranışını geçersiz kılabilmesini sağlar. Bu seçenekler hakkında daha fazla bilgi için bkz . Devralma.

Sanal özelliği geçersiz kılma özelliği, türetilmiş sınıflar için artık sanal olmadığını belirterek mühürlenebilir. Son olarak, bir özellik soyut olarak bildirilebilir. Soyut özellikler sınıfında bir uygulama tanımlamaz ve türetilmiş sınıfların kendi uygulamalarını yazması gerekir. Bu seçenekler hakkında daha fazla bilgi için bkz . Soyut ve Korumalı Sınıflar ve Sınıf Üyeleri.

Not

Bir statik özelliğinin erişimcisine sanal, soyut veya geçersiz değiştiricisi kullanmak bir hatadır.

Örnekler

Bu örnekte örnek, statik ve salt okunur özellikler gösterilmektedir. Klavyeden çalışanın adını alır, NumberOfEmployees değerini 1 artırır ve çalışanın adını ve numarasını görüntüler.

public class Employee
{
    public static int NumberOfEmployees;
    private static int _counter;
    private string _name;

    // A read-write instance property:
    public string Name
    {
        get => _name;
        set => _name = value;
    }

    // A read-only static property:
    public static int Counter => _counter;

    // A Constructor:
    public Employee() => _counter = ++NumberOfEmployees; // Calculate the employee's number:
}

Gizli özellik örneği

Bu örnekte, türetilmiş bir sınıfta aynı ada sahip başka bir özellik tarafından gizlenen bir temel sınıftaki bir özelliğe nasıl erişilir gösterilmektedir:

public class Employee
{
    private string _name;
    public string Name
    {
        get => _name;
        set => _name = value;
    }
}

public class Manager : Employee
{
    private string _name;

    // Notice the use of the new modifier:
    public new string Name
    {
        get => _name;
        set => _name = value + ", Manager";
    }
}

class TestHiding
{
    public static void Test()
    {
        Manager m1 = new Manager();

        // Derived class property.
        m1.Name = "John";

        // Base class property.
        ((Employee)m1).Name = "Mary";

        System.Console.WriteLine($"Name in the derived class is: {m1.Name}");
        System.Console.WriteLine($"Name in the base class is: {((Employee)m1).Name}");
    }
}
/* Output:
    Name in the derived class is: John, Manager
    Name in the base class is: Mary
*/

Önceki örnekteki önemli noktalar şunlardır:

  • Türetilmiş sınıftaki Name özelliği, temel sınıftaki Name özelliğini gizler. Böyle bir durumda, new değiştirici türetilmiş sınıftaki özelliğinin bildiriminde kullanılır:
    public new string Name
    
  • Döküm (Employee), temel sınıftaki gizli özelliğe erişmek için kullanılır.
    ((Employee)m1).Name = "Mary";
    

Üyeleri gizleme hakkında daha fazla bilgi için yeni Değiştirici'ye bakın.

Özellik geçersiz kılma örneği

Bu örnekte, Cube ve Square olmak üzere iki sınıf, Shape adlı soyut bir sınıfı uygular ve onun Area adlı soyut özelliğini geçersiz kılar. Özelliklerde geçersiz kılma değiştiricisinin kullanımına dikkat edin. Program, tarafı giriş olarak kabul eder ve kare ve küp alanlarını hesaplar. Ayrıca alanı giriş olarak kabul eder ve kare ve küp için karşılık gelen tarafı hesaplar.

abstract class Shape
{
    public abstract double Area
    {
        get;
        set;
    }
}

class Square : Shape
{
    public double side;

    //constructor
    public Square(double s) => side = s;

    public override double Area
    {
        get => side * side;
        set => side = System.Math.Sqrt(value);
    }
}

class Cube : Shape
{
    public double side;

    //constructor
    public Cube(double s) => side = s;

    public override double Area
    {
        get => 6 * side * side;
        set => side = System.Math.Sqrt(value / 6);
    }
}

class TestShapes
{
    static void Main()
    {
        // Input the side:
        System.Console.Write("Enter the side: ");
        double side = double.Parse(System.Console.ReadLine());

        // Compute the areas:
        Square s = new Square(side);
        Cube c = new Cube(side);

        // Display the results:
        System.Console.WriteLine($"Area of the square = {s.Area:F2}");
        System.Console.WriteLine($"Area of the cube = {c.Area:F2}");
        System.Console.WriteLine();

        // Input the area:
        System.Console.Write("Enter the area: ");
        double area = double.Parse(System.Console.ReadLine());

        // Compute the sides:
        s.Area = area;
        c.Area = area;

        // Display the results:
        System.Console.WriteLine($"Side of the square = {s.side:F2}");
        System.Console.WriteLine($"Side of the cube = {c.side:F2}");
    }
}
/* Example Output:
    Enter the side: 4
    Area of the square = 16.00
    Area of the cube = 96.00

    Enter the area: 24
    Side of the square = 4.90
    Side of the cube = 2.00
*/

Ayrıca bkz.