Ö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 özellik, bir erişimciyi ve/veya erişimciyi get temsil eden bir setinit 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 init erişimcisi için set kod bloğu yürütülür. Erişimci olmayan bir set özellik salt okunur olarak kabul edilir. Erişimci olmayan bir get özellik salt yazma olarak kabul edilir. Her iki erişimciye de sahip bir özellik okuma-yazmadır. Özelliğin nesne başlatmanın bir parçası olarak ayarlanmasını sağlamak için erişimci yerine bir set erişimci kullanabilirinit, aksi takdirde bunu salt okunur yapabilirsiniz.

Alanlardan farklı olarak, özellikler değişken olarak sınıflandırılmamıştır. Bu nedenle, bir özelliği veya out parametresi olarak ref 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ü ve ardından özelliğin adı ve ardından -accessor ve/veya set erişimci bildiren getbir 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 erişimcinin set değerin 1 ile 12 arasında ayarlandığından Month emin olabilmesi için bir özellik olarak bildirilir. ö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 özelliği çağrılarak değiştirilebilmesi için özel olarak işaretlenir. Genel ve özel erişim kısıtlamaları hakkında daha fazla bilgi için bkz . Erişim Değiştiricileri. Otomatik uygulanan özellikler, basit özellik bildirimleri için basitleştirilmiş söz dizimi sağlar. Daha fazla bilgi için bkz . Otomatik Uygulanan Özellikler.

Get 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 Tam zamanında (JIT) derleyicisi, erişimciyi get uygulamak için yaygın desenleri algılar ve bu desenleri iyileştirir. Ö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 uygulanan özellikler bu deseni izler ve bu iyileştirmelerden yararlanır. Ancak, derleyici derleme zamanında hangi yöntemin çalışma zamanında çağrılabileceğini bilmediğinden sanal get erişimci yöntemi inlin alınamaz. 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ıdır veya dönüş veya throw deyimiyle bitmelidir ve denetim erişimci gövdesinden akamaz.

Uyarı

Erişimciyi kullanarak nesnenin durumunu değiştirmek kötü bir programlama stilidir get .

Erişimci get , 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 adlı valueö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, özelliğine Name bir set 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 erişimcideki yerel değişken bildirimi için örtük parametre adını valuekullanmak bir set hatadır.

Init erişimcisi

Erişimci oluşturma init kodu, yerine anahtar sözcüğünü kullanmanız dışında erişimci set oluşturma koduyla initsetaynıdır. Aradaki fark, erişimcinin init yalnızca oluşturucuda veya nesne başlatıcı kullanılarak kullanılabilmesidir.

Açıklamalar

Özellikler , , private, protected, internal, protected internalveya private protectedolarak publiciş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. get Aynı özelliğin ve set erişimcilerinin farklı erişim değiştiricileri olabilir. Örneğin, getpublic türü set dışından salt okunur erişime izin vermek ve veya protectedolabilirprivate. 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

Statik özelliğin erişimcisinde sanal, soyut veya geçersiz kılma değiştiricisi kullanmak bir hatadır.

Örnekler

Bu örnekte örnek, statik ve salt okunur özellikler gösterilmektedir. Klavyeden çalışanın adını kabul eder, 1 artırır NumberOfEmployees ve Çalışan adı ile 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: {0}", m1.Name);
        System.Console.WriteLine("Name in the base class is: {0}", ((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 özelliği NameName , temel sınıfta ö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
    
  • Atama (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.

Geçersiz kılma özelliği örneği

Bu örnekte, ve Squareolmak üzere iki sınıf Cube soyut bir sınıf Shapeuygular ve soyut Area ö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 = {0:F2}", s.Area);
        System.Console.WriteLine("Area of the cube = {0:F2}", c.Area);
        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 = {0:F2}", s.side);
        System.Console.WriteLine("Side of the cube = {0:F2}", c.side);
    }
}
/* 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.