Руководство C# Property
View more Tutorials:
Property (Свойство) является членом (member) класса, интерфейса. Это расширение поля. Property позволяет вам получить доступ к полю или изменить значение этого поля без необходимости прямого доступа к полю.
Вы можете создать Property, только разрешающий доступ к полю (field), не позволяя изменять значение поля, и наоборот. Это самая сильная сторона одного Property.
С полем (field), если вы можете получить к нему доступ извне, вы также можете изменить его значение, это, очевидно, опасно, рассмотрим следующий пример:
Вы можете создать Property, только разрешающий доступ к полю (field), не позволяя изменять значение поля, и наоборот. Это самая сильная сторона одного Property.
С полем (field), если вы можете получить к нему доступ извне, вы также можете изменить его значение, это, очевидно, опасно, рассмотрим следующий пример:
Employee.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { class Employee { // Чтобы получить доступ снаружи, // данное поле (field) должно бытьi 'public' или 'protected'. public string code; // Чтобы получить доступ снаружи, // данное поле (field) должно бытьi 'public' или 'protected'. public string name; public Employee(string code, string name) { this.code = code; this.name = name; } } class EmployeeTest { public static void Main(string[] args) { // Создать объект Employee. Employee john = new Employee("E01", "John"); // Вы можете получить доступ в имя сотрудника // (name является полем public поэтому вы можете получить доступ снаружи). Console.WriteLine("Employee Name = " + john.name); // Но вы так же можете прикрепить новое значение для поля name. // (Это явно опасно). john.name = "Marry"; Console.WriteLine("Employee Name = " + john.name); Console.Read(); } } }
Property - это решение проблемы, о которой говорилось выше. Ниже пример, в котором используются Property Code, Name для доступа к полю code, name класса Employee2.
Employee2.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { class Employee2 { // Данное поле является private, // оно не позволяет получить доступ снаружи. private string code; // Данное поле является private, // оно не позволяет получить доступ снаружи. private string name; // Объявить property, как public, можено получить дступ снаружи. public string Code { get { return this.code; } set { // 'value' является особым ключевым словом, // которое означает значение, только что прикрепленное для property. this.code = value; } } // Объявить property, как public, позволяющее получить доступ, // но не позволяет прикреплять новое значение. public string Name { get { return this.name; } } public Employee2(string code, string name) { this.code = code; this.name = name; } } }
Test:
Employee2Test.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { class Employee2Test { public static void Main(string[] args) { // Создать объект Employee. Employee2 john = new Employee2("E01", "John"); Console.WriteLine("Employee Code = " + john.Code); Console.WriteLine("Employee Name = " + john.Name); Console.WriteLine("-------"); // Прикрепить новое значение property Code. john.Code = "E02"; // Невозможно прикрепить новое значение для property Name. // john.Name = "Marry"; // ==> Error! Console.WriteLine("Employee Code = " + john.Code); Console.WriteLine("Employee Name = " + john.Name); Console.Read(); } } }
Запуск примера:

Property используется для set (установки) и get (получения) значения поля, по сути рассматривается как особенный метод, поэтому его также можно объявить абстрактным (abstract), и он будет выполнен (implements) в подклассе. Класс имеет Property, объявленное как абстрактное, оно должно быть объявлено абстрактным. Абстрактные свойства также могут быть объявлены в интерфейсе.
Animal это класс который объявляет две абстрактные свойства: Name & Age (имя и возраст):
Animal.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { abstract class Animal { // Абстрактное property (abstract Property). public abstract string Name { get; } // Абстрактное property имеет set & get. public abstract int Age { get; set; } } }
Класс Cat расширяется от Animal и выполняет абстрактные свойства, объявленные в Animal.
Cat.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { class Cat : Animal { private string name; private int age; // Выполнить абстрактное property объявленное в классе Animal. public override string Name { get { return this.name; } } // Выполнить абстрактное property объявленное в классе Animal. public override int Age { get { return this.age; } set { this.age = value; } } // Constructor. public Cat(string name, int age) { this.name = name; this.age = age; } } }
Property в Interface
Вы также можете объявить Property в интерфейсе, эти свойства будут выполнены (implements) в подклассе.
IColor.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { interface IColor { // Абстрактное property у Interface. String Color { get; } } }
Класс Ball выполняет интерфейс IColor, он выполняет (implements) абстрактные свойства, объявленные в IColor.
Ball.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPropertyTutorial { class Ball : IColor { private string color; // Выполнить property объявленное в Interace IColor // (Нельзя написать ключевое слово override здесь, // так как выполняет property у Interface). public string Color { get { return this.color; } } // Constructor. public Ball(String color) { this.color = color; } } }