الخصائص (دليل البرمجة لـ #C)

خصائص يجمع أوجه كلاهما حقول والأساليب. يظهر للمستخدم لكائن ما، وخاصية حقل، يتم الوصول إلى خاصية يتطلب نفس بناء الجملة. إلى implementer من فصل دراسي، خاصية هو كتل تعليمات برمجية أو اثنتين، يمثل ملحق يحصل و/او ملحق تعيين . كتل تعليمات برمجية ل getأسلوب استرجاع القيمة هو تنفيذها عند خاصية هو القراءة؛ وحظر للتعليمات البرمجية setأسلوب استرجاع القيمة هو تنفيذها عند خاصية هو تعيين القيمة جديدة. خاصية بدون setأسلوب استرجاع قيمة هو اعتبار القراءة فقط. خاصية بدون getأسلوب استرجاع قيمة هو اعتبار كتابة فقط. خاصية يحتوي كلا accessors هو القراءة والكتابة.

بخلاف حقول الخصائص غير clكـsified كـ المتغيرات. ولذلك، لا يمكنك pكـs خاصية كـ ref (مرجع #C)أو المهلة ( مرجع C# )معلمة.

خصائص لها استخدامات عديدة: يقومون بالتحقق من صحة البيانات قبل السماح بتغيير؛ يمكن بشفافية بعرض البيانات تشغيل فئة بحيث يتم استرداد البيانات فعلياً من أي مصدر آخر، مثل قاعدة بيانات؛ يمكنك تنفيذ إجراء عند تم تغييره البيانات، مثل رفع حدث، أو قم بتغيير القيمة للحقول الأخرى.

خصائص are declared في the فئة حظر بواسطة specifying the المستوى الوصول of the حقل, followed بواسطة the نوع of the خاصية, followed بواسطة the اسم of the خاصية, and followed بواسطة a تعليمات برمجية حظر that declares a get-accessor و/أو a set accessor. فعلى سبيل المثال:

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

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

في this مثال, Month هو declared كـ a خاصية so that the set accessor can make sure that the Month القيمة هو التعيين between 1 و 12. The Month خاصية uses a private حقل إلى مقطع صوتي the الفعلي القيمة. The real الموقع of a خاصية's بيانات هو often referred إلى كـ the خاصية's "تخزين مساعد." It هو عام for خصائص إلى استخدم private حقول كـ a تخزين مساعد. الحقل هو وضع علامة خاص التأكد من أنه يمكن فقط تغييرها بواسطة استدعاء خاصية. لمزيد من المعلومات حول العامة و قيود الوصول الخاصة، راجع معدلات الاتصال ( ارشادات البرمجة C# ).

توفر خصائص المطبقة بتلقائية بناء جملة مبسطة لتعريفات خاصية بسيطة. لمزيد من المعلومات، راجع الخصائص تلقائية التنفيذ (دليل البرمجة لـ #C).

يحصل واصف الوصول

النص الأساسي من getلما ملحق من الأسلوب. يجب أن ترجع القيمة نوع خاصية. التنفيذ getأسلوب استرجاع قيمة هو مساوية لقراءة قيمة الحقل. على سبيل المثال، عند الذي يتم إرجاع متغير خاصة من getممكّن أسلوب استرجاع قيمة وامثليه الأداء، الاستدعاء getالأسلوب أسلوب استرجاع قيمة هو inlined بواسطة المحول البرمجي لذلك هو لا زائد عن الحد استدعاء الأسلوب. ومع ذلك، ظاهري getلا يمكن أن يكون الأسلوب أسلوب استرجاع قيمة inlined لأنه لم تعرف المحول البرمجي عند التحويل البرمجي-الوقت يمكن استدعاء الأسلوب فعلياً عند تشغيل الوقت. يلي هو على getالموصل الذي يرجع القيمة حقل خاص name:

class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
    }
}

عندما تشير خاصية، باستثناء كهدف لواجب getأسلوب استرجاع القيمة هو استدعاء قراءة القيمة خاصية. فعلى سبيل المثال:

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

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

getيجب أن ينتهي أسلوب استرجاع قيمة في إرجاع أو الإلقاء عبارة ، و لا انسياب التحكم إيقاف نص أسلوب استرجاع قيمة.

هو نمط برمجة غير صالحة لتغيير الولاية الكائن باستخدام getأسلوب استرجاع قيمة. على سبيل المثال، يعطي واصف الوصول التالية التأثير الجانبي لتغيير الولاية الكائن في كل مرة التي numberالحقل هو الوصول إليها.

private int number;
public int Number
{
    get
    {
        return number++;   // Don't do this
    }
}

getيمكن استخدام أسلوب استرجاع القيمة إلى بإرجاع القيمة حقل أو إلى حساب به والعودة it. فعلى سبيل المثال:

class Employee
{
    private string name;
    public string Name
    {
        get
        {
            return name != null ? name : "NA";
        }
    }
}

في السابق رمز القطعة، في حالة عدم تعيين القيمة إلى Nameخاصية، ستقوم بإرجاع القيمة NA.

المجموعة واصف الوصول

setلما ملحق أسلوب العائد له اكتب هوخالية . فهو يستخدم معلمة ضمني يسمى value، نوعه هو نوع خاصية. في المثال التالي، setأسلوب استرجاع قيمة هو تمت الإضافة إلى Nameخاصية:

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

عندما تقوم بتعيين القيمة إلى خاصية، setأسلوب استرجاع القيمة هو استدعاء باستخدام وسيطة يوفر القيمة جديدة. فعلى سبيل المثال:

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

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

هو خطأ لاستخدام اسم معلمة ضمني، value، لتعريف متغير محلي في setأسلوب استرجاع قيمة.

ملاحظات

خصائص can be marked كـpublic,private,protected,internal, أوprotected internal. تحديد معدلات الوصول إلى هذه الطريقة مستخدمي فئة يمكن الوصول إلى الخاصية. getو setaccessors لنفس خاصية قد معدلات وصول مختلف. على سبيل المثال، getقد يكون publicإلى السماح للقراءة-فقط الوصول إليه من خارج النوع، و setقد يكون privateأو protected. لمزيد من المعلومات، راجع معدلات الاتصال ( ارشادات البرمجة C# ).

قد يكون معرف خاصية كخاصية ثابتة باستخدام staticكلمة أساسية. يجعل هذا خاصية متوفر إلى المتصلين في أي وقت، حتى في حالة وجود لا موجود مثيل للفئة. لمزيد من المعلومات، راجع فئة عم ثابتة والثابتة فئة الأعضاء (C# البرمجة الدليل).

خاصية قد يتم وضع علامة كخاصية ظاهري باستخدام ظاهرية كلمة أساسية. بما يمكن من الفئات المشتقة إلى يمنع سلوك خاصية باستخدام الأساسية يمنع. لمزيد من المعلومات حول هذه الخيارات، راجع الوراثة (دليل البرمجة لـ #C).

تحديد النسبة اشتقاق الفئات خاصية تجاوز يمكن خاصية ظاهري أيضا أن مختوم ، هو لم تعد الظاهري. أخيرا، خاصية يمكن أن يكون التصريح مجردة . Th هو يعني وجود هو يجب أن يكتب لا التنفيذ في الفئة والفئات المشتقة التنفيذ الخاصة بها. لمزيد من المعلومات حول هذه الخيارات، راجع الفئات المجردة والفئات المغلقة وأعضاء الفئات (دليل البرمجة لـ #C).

ملاحظة

هو خطأ للاستخدام تشغيل الظاهري ( مرجع C# )، abstract (مرجع #C)، أو override (مرجع #C)التعديل تشغيل أسلوب استرجاع قيمة من ثابتة تشغيل خاصية.

مثال

يوضح هذا المثال مثيل، ثابتة، و الخصائص للقراءة فقط. يقبل اسم الموظف من لوحة المفاتيح، قم بزيادة NumberOfEmployeesقبل 1، وعرض اسم الموظف ورقم.

public class Employee
{
    public static int NumberOfEmployees;
    private static int counter;
    private string name;

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

    // A read-only static property:
    public static int Counter
    {
        get { return counter; }
    }

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

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
*/

يوضح هذا المثال كيفية الوصول إلى خاصية في فئة أساسية التي تم إخفاؤها بواسطة خاصية آخر له نفس الاسم في فئة مشتقة.

public class Employee
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

public class Manager : Employee
{
    private string name;

    // Notice the use of the new modifier:
    public new string Name
    {
        get { return 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
*/

The following are important نقاط في the السابق مثال:

  • The خاصية Name في the الفئة المشتقة hides the خاصية Name في the فئة الأساس. في such a حالة, the new معدّل هو used في the إعلان of the خاصية في the الفئة المشتقة:

    public new string Name
    
  • The cast (Employee) هو used إلى الوصول the مخفي خاصية في the فئة الأساس:

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

    For المزيد معلومات حول hiding الأعضاء, see the المعدّل new (مرجع #C).

في this مثال, الثاني فئات, Cube و Square, implement an abstract فئة, Shape, و يمنع its abstract Area خاصية. ملاحظة the استخدم of the يمنع معدّل تشغيل the خصائص. The برنامج accepts the side كـ an إدخال و calculates the areas for the square و مكعب. It also accepts the مساحة كـ an إدخال و calculates the corresponding side for the square و مكعب.

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

class Square : Shape
{
    public double side;

    public Square(double s)  //constructor
    {
        side = s;
    }

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

class Cube : Shape
{
    public double side;

    public Cube(double s)
    {
        side = s;
    }

    public override double Area
    {
        get
        {
            return 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
*/

راجع أيضًا:

المرجع

الخصائص (دليل البرمجة لـ #C)

خصائص واجهة (البرمجة C# إرشادات)

الخصائص تلقائية التنفيذ (دليل البرمجة لـ #C)

المبادئ

دليل البرمجة لـ #C