Używanie właściwości (Przewodnik programowania w języku 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 (odwołanie w C#) lub out (odwołanie w C#) 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 (Przewodnik programowania w języku 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 zaimplementowane automatycznie (Przewodnik programowania w języku 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 (Przewodnik programowania w języku 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 statyczni członkowie klas (Przewodnik programowania w języku 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 (Przewodnik programowania w języku 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 zapieczętowane oraz członkowie klas (Przewodnik programowania w języku C#).
[!UWAGA]
Jest błędem, aby użyć virtual (odwołanie w C#), abstract (odwołanie w C#), lub override (odwołanie w C#) 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 new — Modyfikator (odwołanie w C#).
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 (Przewodnik programowania w języku C#)
Właściwości interfejsu (Przewodnik programowania w języku C#)
Właściwości zaimplementowane automatycznie (Przewodnik programowania w języku C#)