Özellikleri Kullanma (C# Programlama Kılavuzu)Using Properties (C# Programming Guide)

Özellikler her iki alanın ve yöntemin yönlerini birleştirir.Properties combine aspects of both fields and methods. Bir nesnenin kullanıcısına, bir özellik bir alan gibi görünür, özelliğe erişim de aynı sözdizimini gerektirir.To the user of an object, a property appears to be a field, accessing the property requires the same syntax. Bir sınıfın uygulayıcısı için bir özellik bir veya iki kod blobunun yanı sıra bir Get erişimcisini ve/veya set erişimcisini temsil eder.To the implementer of a class, a property is one or two code blocks, representing a get accessor and/or a set accessor. @No__t_0 erişimcisinin kod bloğu, özellik okuma sırasında yürütülür; set erişimcisine yönelik kod bloğu, özelliğe yeni bir değer atandığında yürütülür.The code block for the get accessor is executed when the property is read; the code block for the set accessor is executed when the property is assigned a new value. @No__t_0 erişimcisi olmayan bir özellik salt okunurdur.A property without a set accessor is considered read-only. @No__t_0 erişimcisi olmayan bir özellik salt yazılır olarak değerlendirilir.A property without a get accessor is considered write-only. Her iki erişimciyi sahip bir özellik okuma-yazma ' dır.A property that has both accessors is read-write.

Alanların aksine, özellikler değişken olarak sınıflandırılmaz.Unlike fields, properties are not classified as variables. Bu nedenle, bir özelliği ref veya Out parametresi olarak geçiremezsiniz.Therefore, you cannot pass a property as a ref or out parameter.

Özelliklerin birçok kullanımı vardır: bir değişikliğe izin vermeden önce verileri doğrulayabilir; verilerin aslında bir veritabanı gibi başka bir kaynaktan alındığı bir sınıf üzerinde saydam bir şekilde veri sunabilir; bir olayı oluşturma veya diğer alanların değerini değiştirme gibi veriler değiştirildiğinde bir eylem gerçekleştirebilir.Properties have many uses: they can validate data before allowing a change; they can transparently expose data on a class where that data is actually retrieved from some other source, such as a database; they can take an action when data is changed, such as raising an event, or changing the value of other fields.

Özellikler, alanın erişim düzeyini, sonra özelliğin türünü ve sonra da bir get erişimcisi ve/veya set erişimcisi bildiren bir kod bloğu belirtilerek, sınıf bloğunda bildirilir.Properties are declared in the class block by specifying the access level of the field, followed by the type of the property, followed by the name of the property, and followed by a code block that declares a get-accessor and/or a set accessor. Örneğin:For example:

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 özellik olarak bildirildiği için set erişimcisinin Month değerinin 1 ile 12 arasında ayarlanmış olduğundan emin olabilir.In this example, Month is declared as a property so that the set accessor can make sure that the Month value is set between 1 and 12. @No__t_0 özelliği, gerçek değeri izlemek için özel bir alan kullanır.The Month property uses a private field to track the actual value. Özelliğin verilerinin gerçek konumu genellikle özelliğin "yedekleme deposu" olarak adlandırılır.The real location of a property's data is often referred to as the property's "backing store." Özelliklerin özel alanları bir yedekleme deposu olarak kullanması yaygındır.It is common for properties to use private fields as a backing store. Bu alan, yalnızca özelliği çağırarak değiştirilebilmesi için özel olarak işaretlenir.The field is marked private in order to make sure that it can only be changed by calling the property. Ortak ve özel erişim kısıtlamaları hakkında daha fazla bilgi için bkz. erişim değiştiricileri.For more information about public and private access restrictions, see Access Modifiers.

Otomatik uygulanan özellikler basit özellik bildirimleri için Basitleştirilmiş söz dizimi sağlar.Auto-implemented properties provide simplified syntax for simple property declarations. Daha fazla bilgi için bkz. Otomatik uygulanan özellikler.For more information, see Auto-Implemented Properties.

Get erişimcisiThe get Accessor

@No__t_0 erişimcisinin gövdesi bir yönteme benzer.The body of the get accessor resembles that of a method. Özellik türünün bir değerini döndürmesi gerekir.It must return a value of the property type. @No__t_0 erişimcisinin yürütülmesi alanın değerini okumayla eşdeğerdir.The execution of the get accessor is equivalent to reading the value of the field. Örneğin, get erişimcisinden özel değişkeni döndürmekte ve iyileştirmeler etkinleştirildikten sonra, get erişimci metoduna yapılan çağrı derleyici tarafından satır içine alınır ve bu nedenle bir yöntem çağrı yükü yoktur.For example, when you are returning the private variable from the get accessor and optimizations are enabled, the call to the get accessor method is inlined by the compiler so there is no method-call overhead. Ancak, derleyici derleme zamanında hangi yöntemin çalışma zamanında çağrıldığı hakkında bilgi sahibi olmadığından, bir sanal get erişimci yöntemi satır içine alınamaz.However, a virtual get accessor method cannot be inlined because the compiler does not know at compile-time which method may actually be called at run time. Aşağıda bir özel alan _name değerini döndüren bir get erişimcisi verilmiştir:The following is a get accessor that returns the value of a private field _name:

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

Özelliğe başvurduğunuzda, bir atamanın hedefi dışında, özelliğin değerini okumak için get erişimcisi çağrılır.When you reference the property, except as the target of an assignment, the get accessor is invoked to read the value of the property. Örneğin:For example:

Person person = new Person();
//...

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

@No__t_0 erişimcisinin Return veya throw ifadesinde bitmesi ve denetim erişimci gövdesinin akışını kapatamıyor olması gerekir.The get accessor must end in a return or throw statement, and control cannot flow off the accessor body.

@No__t_0 erişimcisini kullanarak nesnenin durumunu değiştirmek için hatalı bir programlama stilidir.It is a bad programming style to change the state of the object by using the get accessor. Örneğin, aşağıdaki erişimci _number alana her erişildiğinde nesnenin durumunu değiştirmenin yan etkisini üretir.For example, the following accessor produces the side effect of changing the state of the object every time that the _number field is accessed.

private int _number;
public int Number => _number++;	// Don't do this        

@No__t_0 erişimcisi, alan değerini döndürmek veya hesaplamak ve döndürmek için kullanılabilir.The get accessor can be used to return the field value or to compute it and return it. Örneğin:For example:

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

Önceki kod segmentinde, Name özelliğine bir değer atamadıysanız, NA değeri döndürülür.In the previous code segment, if you do not assign a value to the Name property, it will return the value NA.

Set erişimcisiThe set Accessor

@No__t_0 erişimcisi, dönüş türü voidolan bir yönteme benzer.The set accessor resembles a method whose return type is void. Türü özelliğin türü olan value adlı örtük bir parametre kullanır.It uses an implicit parameter called value, whose type is the type of the property. Aşağıdaki örnekte, Name özelliğine bir set erişimcisi eklenmiştir:In the following example, a set accessor is added to the Name property:

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

Özelliğe bir değer atadığınızda, set erişimcisi yeni değeri sağlayan bir bağımsız değişken kullanılarak çağrılır.When you assign a value to the property, the set accessor is invoked by using an argument that provides the new value. Örneğin:For example:

Person person = new Person();
person.Name = "Joe";  // the set accessor is invoked here                

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

@No__t_1 erişimcisindeki yerel değişken bildirimi için value örtük parametre adını kullanmak hatadır.It is an error to use the implicit parameter name, value, for a local variable declaration in a set accessor.

AçıklamalarRemarks

Özellikler public, private, protected, internal, protected internal veya private protected olarak işaretlenebilir.Properties can be marked as public, private, protected, internal, protected internal or private protected. Bu erişim değiştiricileri, sınıfın kullanıcılarının özelliğe nasıl erişekullanabileceğinizi tanımlar.These access modifiers define how users of the class can access the property. Aynı özelliğin get ve set erişimcileri farklı erişim değiştiricilerine sahip olabilir.The get and set accessors for the same property may have different access modifiers. Örneğin get, türün dışından salt okuma erişimine izin vermek için public olabilir ve set private veya protected olabilir.For example, the get may be public to allow read-only access from outside the type, and the set may be private or protected. Daha fazla bilgi için bkz. erişim değiştiricileri.For more information, see Access Modifiers.

Bir özellik static anahtar sözcüğü kullanılarak statik bir özellik olarak bildirilemez.A property may be declared as a static property by using the static keyword. Bu özellik, sınıfın bir örneği mevcut olmasa bile, özelliği herhangi bir zamanda çağıranlar için kullanılabilir hale getirir.This makes the property available to callers at any time, even if no instance of the class exists. Daha fazla bilgi için bkz. statik sınıflar ve statik sınıf üyeleri.For more information, see Static Classes and Static Class Members.

Bir özellik sanal anahtar sözcüğü kullanılarak sanal bir özellik olarak işaretlenebilir.A property may be marked as a virtual property by using the virtual keyword. Bu, türetilmiş sınıfların geçersiz kılma anahtar sözcüğünü kullanarak özellik davranışını geçersiz kılmasını sağlar.This enables derived classes to override the property behavior by using the override keyword. Bu seçenekler hakkında daha fazla bilgi için bkz. Devralma.For more information about these options, see Inheritance.

Sanal bir özelliği geçersiz kılan bir özellik de mühürlenebilir, bu da türetilmiş sınıflar için artık sanal değildir.A property overriding a virtual property can also be sealed, specifying that for derived classes it is no longer virtual. Son olarak, bir özellik soyutolarak bildirilemez.Lastly, a property can be declared abstract. Bu, sınıfta bir uygulama olmadığı ve türetilen sınıfların kendi uygulamasını yazması gerektiği anlamına gelir.This means that there is no implementation in the class, and derived classes must write their own implementation. Bu seçenekler hakkında daha fazla bilgi için bkz. soyut ve korumalı sınıflar ve sınıf üyeleri.For more information about these options, see Abstract and Sealed Classes and Class Members.

Not

Statik bir özelliğin erişimcisi üzerinde sanal, Özetveya geçersiz kılma değiştiricisi kullanmak hatadır.It is an error to use a virtual, abstract, or override modifier on an accessor of a static property.

ÖrnekExample

Bu örnek örnek, statik ve salt okunurdur özelliklerini gösterir.This example demonstrates instance, static, and read-only properties. Klavyeden çalışanın adını kabul eder, 1 ile NumberOfEmployees artırır ve çalışan adını ve numarasını görüntüler.It accepts the name of the employee from the keyboard, increments NumberOfEmployees by 1, and displays the Employee name and number.

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:            
}

class TestEmployee
{
    static void Main()
    {
        Employee.NumberOfEmployees = 107;
        Employee e1 = new Employee();
        e1.Name = "Claude Vige";

        System.Console.WriteLine("Employee number: {0}", Employee.Counter);
        System.Console.WriteLine("Employee name: {0}", e1.Name);
    }
}
/* Output:
    Employee number: 108
    Employee name: Claude Vige
*/

ÖrnekExample

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şebileceğiniz gösterilmektedir:This example demonstrates how to access a property in a base class that is hidden by another property that has the same name in a derived class:

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
{
    static void Main()
    {
        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
*/

Aşağıda, önceki örnekteki önemli noktaları verilmiştir:The following are important points in the previous example:

  • Türetilmiş sınıftaki özellik Name, temel sınıftaki özelliği Name gizler.The property Name in the derived class hides the property Name in the base class. Böyle bir durumda new değiştiricisi türetilmiş sınıftaki özelliğin bildiriminde kullanılır:In such a case, the new modifier is used in the declaration of the property in the derived class:

    public new string Name
    
  • Cast (Employee), temel sınıftaki Hidden özelliğine erişmek için kullanılır:The cast (Employee) is used to access the hidden property in the base class:

    ((Employee)m1).Name = "Mary";
    

    Üyeleri gizleme hakkında daha fazla bilgi için bkz. Yeni değiştirici.For more information about hiding members, see the new Modifier.

ÖrnekExample

Bu örnekte, iki sınıf, Cube ve Square, soyut bir sınıfı uygular Shape ve soyut Area özelliğini geçersiz kılar.In this example, two classes, Cube and Square, implement an abstract class, Shape, and override its abstract Area property. Özelliklerde geçersiz kılma değiştiricisinin kullanımını göz önünde kılarsınız .Note the use of the override modifier on the properties. Program, yüzü bir giriş olarak kabul eder ve kare ve küpün alanını hesaplar.The program accepts the side as an input and calculates the areas for the square and cube. Ayrıca, alanı bir girdi olarak kabul eder ve kare ve küp için ilgili tarafı hesaplar.It also accepts the area as an input and calculates the corresponding side for the square and cube.

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.See also