Sdílet prostřednictvím


Pomocí vlastnosti (Příručka programování C#)

Vlastnosti kombinovat aspekty pole a metody.Uživateli objektu vlastnost jeví do pole vlastnosti přístup vyžaduje stejnou syntaxi.Implementátor třídy, jeden nebo dva bloky kódu představuje vlastnost je získat přístupový objekt nebo nastavit přístupový objekt.Blok kódu get přístupový objekt spuštěn přečtení vlastnosti; blok kódu set přístupový objekt je spuštěn při přiřazení nové hodnoty vlastnosti.Vlastnost bez set přístupový objekt je považován za jen pro čtení.Vlastnost bez get přístupový objekt je považován za jen pro zápis.Vlastnost, která má i přístupové objekty je pro čtení i zápis.

Na rozdíl od polí vlastnosti nejsou klasifikovány jako proměnné.Proto nelze předat jako vlastnost REF (C#-Reference) nebo mimo (C#-Reference) parametr.

Vlastnosti mají mnoho použití: jejich můžete ověřit data před povolením změnit; jsou transparentně vystavit dat na třídě, kde skutečně načtených dat z jiného zdroje, jako je například databáze; Akce využívají při změně dat, například zvýšení událost nebo změna hodnoty jiných polí.

Vlastnosti jsou deklarovány v bloku třídy určením pole úroveň přístupu, následuje typ vlastnosti, následuje název vlastnosti a následuje blok kódu, který prohlašuje get-přístupový objekt nebo set přístupový objekt.Příklad:

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

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

V tomto příkladu Month je deklarována jako vlastnost tak, set přístupový objekt ověřit, zda Month hodnotu od 1 do 12.Month Vlastnost pole private používá ke sledování skutečné hodnoty.Skutečné umístění dat vlastností je často označována jako vlastnosti zálohování úložiště." Je běžné použití soukromých polí jako zálohování úložiště vlastností.Je označeno soukromý Ujistěte se, že ji lze změnit pouze voláním vlastnosti pole.Další informace o omezení přístupu k veřejné a soukromé, viz Modifikátory přístupu (Příručka programování C#).

Vlastnosti automatické implementována stanovit zjednodušené syntaxe vlastnosti jednoduchého prohlášení.Další informace naleznete v tématu Vlastnosti automatické implementována (Příručka programování C#).

Přístupový objekt get

Těla get přístupový objekt připomíná, že metoda.Hodnota vlastnosti typu musí vrátit.Provádění get přístupový objekt je ekvivalentní čtení hodnoty pole.Například když vracíte k soukromé proměnné z get přístupový objekt a optimalizace jsou povolena, volání get metoda přístupový objekt je inlined kompilátorem, takže žádné nároky na volání metody.Však virtuální get metoda přístupový objekt nemůže být inlined, protože kompilátor neví, v době kompilace, která metoda může být volána skutečně za běhu.Je get přístupový objekt, který vrací hodnotu pole private name:

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

Při odkazu na vlastnost, s výjimkou jako cíl přiřazení, get přístupový objekt je možné načíst hodnotu vlastnosti.Příklad:

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

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

get Musí končit přístupový objekt vrátit nebo vyvoláním prohlášení a řízení přetékat nemůže vypnout subjekt přístupový objekt.

Je chybná stylu programování změna stavu objektu pomocí get přístupový objekt.Například následující přístupový objekt vytváří efekt straně změny stavu objektu vždy, number přístupu k poli.

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

get Přístupový objekt lze vrátit hodnotu pole nebo ji vypočítat a vrátit.Příklad:

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

Předchozí kód segmentu, pokud nepřiřadíte hodnotu Name vlastnost, vrátí hodnotu NA.

Sada přístupový objekt

set Přístupový objekt podobná metoda, jejíž návratový typ je void.Implicitní parametr, nazývá value, jejichž typ je typ vlastnosti.V následujícím příkladu set přístupový objekt je přidán do Name vlastnosti:

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

Při přiřazení hodnoty k vlastnosti, set přístupový objekt je vyvoláno pomocí argument, který obsahuje novou hodnotu.Příklad:

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

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

Jedná se o chybu použít implicitní parametr název, value, pro deklaraci lokální proměnné v set přístupový objekt.

Poznámky

Properties can be marked as public, private, protected, internal, or protected internal.Tyto modifikátory přístupu definovat přístup vlastnost třídy uživatelů.get a set přístupové objekty pro stejnou vlastnost může mít modifikátory přístupu různých.Například get mohou být public povolit přístup jen pro čtení z mimo typu a set mohou být private nebo protected.Další informace naleznete v tématu Modifikátory přístupu (Příručka programování C#).

Vlastnost může jako statická vlastnost deklarována pomocí static klíčové slovo.Díky vlastnost pro volající kdykoli, i v případě, že neexistuje žádná instance třídy.Další informace naleznete v tématu Statické třídy a členy statických tříd (Příručka programování C#).

Vlastnost může označena jako virtuální vlastnosti pomocí virtuální klíčové slovo.Díky tomu lze přepsat pomocí vlastnosti chování odvozené třídy potlačit klíčové slovo.Další informace o těchto možnostech naleznete v Dědičnost (Příručka programování C#).

Vlastnost přepsání virtuální vlastnosti lze také uzavřených, určení pro odvozené třídy je již virtuální.Konečně můžete vlastnost deklarována abstraktní.To znamená, že neexistuje žádná implementace třídy a napsat vlastní implementaci odvozené třídy.Další informace o těchto možnostech naleznete v Abstraktní a uzavřených tříd a členů tříd (Příručka programování C#).

[!POZNÁMKA]

Je při použití virtuální (C#-Reference), abstraktní (C#-Reference), nebo přepsat (C#-Reference) modifikátor přístupový objekt statické vlastnost.

Příklad

Tento příklad ukazuje vlastnosti instance, statické a jen pro čtení.Přijímá jméno zaměstnance z klávesnice přírůstky NumberOfEmployees 1 a zaměstnance zobrazí název a číslo.

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

Tento příklad ukazuje, jak získat přístup k vlastnosti v základní třídě, skrytá pomocí další vlastnost, která má stejný název v odvozené třídě.

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

Důležité body v předchozím příkladu jsou následující:

  • Vlastnost Name v odvozené třídě skrývá vlastnost Name v základní třídě.V takovém případě new modifikátoru v deklaraci vlastnosti v odvozené třídě:

    public new string Name
    
  • Tavby (Employee) se používá k přístupu skryté vlastnosti základní třídy:

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

    Další informace o skrytí členů naleznete Modifikátor nové (C#-Reference).

Například dvě třídy Cube a Square, implementovat abstraktní třída Shapea přepsat jeho abstraktní Area vlastnost.Poznámka: použití potlačit modifikátor vlastností.Program přijímá straně jako vstup a vypočítá oblastí pro čtverec a krychle.Také přijímá oblasti jako vstup a vypočítá odpovídající straně čtverec a krychle.

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

Viz také

Referenční dokumentace

Vlastnosti (Příručka programování C#)

Vlastnosti (Příručka programování C#) rozhraní

Vlastnosti automatické implementována (Příručka programování C#)

Koncepty

Příručka programování C#