Udostępnij za pośrednictwem


Za pomocą właściwości (Podręcznik programowania C#)

Właściwości połączyć aspektów zarówno pól i metod.Do użytkownika obiektu, właściwości wydaje się być pole, dostęp do właściwości wymaga takiej samej składni.Realizator klasy, właściwość jest jeden lub dwa bloki kodu reprezentującego uzyskać akcesor i/lub set akcesor.Blok kodu dla get akcesor jest wykonywany, gdy właściwość jest do odczytu; blok kodu dla set akcesor jest wykonywany, gdy właściwość jest przypisany nową wartość.Właściwość bez set akcesor uznaje się tylko do odczytu.Właściwość bez get akcesor, jest traktowana jako tylko do zapisu.Właściwość, która ma zarówno akcesorów jest odczytu i zapisu.

W przeciwieństwie do pól właściwości nie są klasyfikowane jako zmienne.W związku z tym, nie można przekazać właściwości jako REF (C# odniesienia) lub out (C# odniesienia) parametru.

Właściwości mają wiele zastosowań: one może sprawdzać poprawność danych przed zezwoleniem na zmianę; przezroczysty mogą zawierać dane dotyczące klasy, gdzie dane faktycznie jest pobierana z innego źródła, takie jak bazy danych; one podjąć działania, po zmianie danych, takich jak podnoszenie zdarzenie lub zmiany wartości w innych polach.

Właściwości są zadeklarowane w bloku klasy przez określenie poziomu dostępu, w polu, następuje typ właściwości, następuje nazwa właściwości i następuje blok kodu, który deklaruje get-akcesor i/lub set akcesor.Na przykład:

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

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

W tym przykładzie Month jest zadeklarowany jako właściwość tak że set akcesor można upewnić się, że Month ma wartość od 1 do 12.Month Do śledzenia wartości rzeczywistych właściwości używane pole private.Rzeczywista lokalizacja danych właściwości jest często nazywane właściwości "magazynu." Jest wspólne dla właściwości, aby użyć pola private jako magazynu.Pole jest oznaczone jako prywatne, aby upewnić się, że to może być zmieniane tylko przez wywołanie właściwości.Aby uzyskać więcej informacji na temat ograniczeń dostępu do publicznych i prywatnych, zobacz Modyfikatory dostępu (Podręcznik programowania C#).

Właściwości auto wdrożone przewidują uproszczone składni deklaracji właściwości prostych.Aby uzyskać więcej informacji, zobacz Właściwości auto wdrożone (Podręcznik programowania C#).

Akcesor get

Organ get akcesor przypomina metodę.Musi ona zwracać wartość typu właściwości.Wykonanie z get akcesor jest równoważne do odczytywania wartości w polu.Na przykład, po powrocie tej zmiennej prywatnej get akcesor i optymalizacje są włączone, wywołanie do get metodę akcesora jest inlined przez kompilator, więc nie ma żadnych narzutów wywołanie metody.Jednakże wirtualnego get metodę akcesora nie może być inlined, ponieważ kompilator nie będzie wiadomo, w czasie kompilacji, która metoda rzeczywiście może o nazwie w czasie wykonywania.Oto get akcesor zwracającą wartość pole private name:

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

Kiedy można odwołać się do właściwości, z wyjątkiem jako cel przydziału, get akcesor jest wywoływany odczytać wartość właściwości.Na przykład:

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

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

get Akcesor musi kończyć się w zwrotu lub throw instrukcji i kontroli przepływu nie można wyłączyć organ akcesor.

Jest zły styl programowania, aby zmienić stan obiektu przy użyciu get akcesor.Na przykład, następujące akcesor daje efekt uboczny zmiany stanu obiektu każdym, number uzyskać dostępu do pola.

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

get Akcesor można zwrócić wartość pola lub obliczyć ją i zwracają go.Na przykład:

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

W poprzednich segmentu kodu, jeśli nie należy przypisywać wartości do Name właściwość, to zostanie zwrócona wartość NA.

Zestaw akcesor

set Akcesor jest podobna do metody, których typ zwracany jest void.Wykorzystuje parametr niejawny o nazwie value, którego typem jest typ właściwości.W poniższym przykładzie set akcesor jest dodawana do Name właściwość:

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

Podczas przypisywania wartości do właściwości, set akcesor jest wywoływany przy użyciu argumentu zawiera nową wartość.Na przykład:

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

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

Występuje błąd, należy użyć nazwy parametr niejawny value, w deklaracji zmiennej lokalnej w set akcesor.

Uwagi

Properties can be marked as public, private, protected, internal, or protected internal.Modyfikatory dostępu, te definiują klasy dostępu przez użytkowników właściwości.get i set akcesorów dla tej samej właściwości mogą mieć modyfikatorów dostępu.Na przykład get może być public do umożliwienia dostępu tylko do odczytu z zewnątrz typu oraz set może być private lub protected.Aby uzyskać więcej informacji, zobacz Modyfikatory dostępu (Podręcznik programowania C#).

Właściwości mogą być zadeklarowane jako właściwość statyczna za pomocą static słowa kluczowego.Właściwość temu dostępne dla kodu wywołującego w dowolnym momencie, nawet jeśli istnieje nie instancji klasy.Aby uzyskać więcej informacji, zobacz Klasy statyczne i elementów klas statycznych (Podręcznik programowania C#).

Właściwość może być oznaczona jako właściwości wirtualnych za pomocą wirtualnego słowa kluczowego.Dzięki temu klas pochodnych zastąpić zachowanie właściwości za pomocą zastąpić słowa kluczowego.Aby uzyskać więcej informacji o tych opcjach, zobacz Dziedziczenie (Podręcznik programowania C#).

Właściwość przesłanianie właściwości wirtualnych można także zamkniętych, określając, że dla klas pochodnych nie jest już wirtualnych.Wreszcie, właściwość może być deklarowana abstrakcyjna.Oznacza to, że nie ma żadnych wdrożenia w klasie i klas pochodnych należy napisać własne realizacji.Aby uzyskać więcej informacji o tych opcjach, zobacz Klasy abstrakcyjne i zamkniętych i elementy klas (Podręcznik programowania C#).

[!UWAGA]

Jest błędem, aby użyć wirtualne (C# odniesienia), streszczenie (C# odniesienia), lub zastąpić (C# odniesienia) modyfikator na akcesor statyczne właściwości.

Przykład

Ten przykład demonstruje właściwości instancji, statyczne i tylko do odczytu.Przyjmuje nazwę pracownika z klawiatury, skoki NumberOfEmployees przez 1 i wyświetla pracownika, nazwa i numer.

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

W tym przykładzie przedstawiono sposób dostępu do właściwości w klasie bazowej, które są ukryte przez inną właściwość, która ma taką samą nazwę w klasie pochodnej.

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

Ważne punkty w poprzednim przykładzie są następujące:

  • Właściwość Name w klasie pochodnej ukrywa właściwość Name w klasie podstawowej.W takim przypadku new w deklaracji właściwości w klasie pochodnej stosowany jest modyfikator:

    public new string Name
    
  • Obsada (Employee) jest używany do dostępu do właściwości ukryte w klasie bazowej:

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

    Aby uzyskać więcej informacji na temat ukrywanie członków, zobacz nowe modyfikator (C# odniesienia).

W tym przykładzie dwie klasy Cube i Square, zaimplementować klasy abstrakcyjnej, Shapei zastąpienie jej abstrakcyjna Area właściwości.Uwaga Użycie zastąpić modyfikator właściwości.Program akceptuje po stronie jako dane wejściowe i oblicza obszarów dla kwadratu i modułu.Również akceptuje obszaru jako dane wejściowe i oblicza odpowiednie boczne kwadrat i modułu.

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

Zobacz też

Informacje

Właściwości (Podręcznik programowania C#)

Interfejs właściwości (Podręcznik programowania C#)

Właściwości auto wdrożone (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#