Руководство C# Property

1- C# Property

Property (Свойство) является членом (member) класса, интерфейса. Это расширение поля. Property позволяет вам получить доступ к полю или изменить значение этого поля без необходимости прямого доступа к полю.

Вы можете создать  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  CodeName для доступа к полю codename  класса 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();
        }
    }

}
Запуск примера:

2- Абстрактный Property (Abstract Property)

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;
        }
    }

}