Руководство 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
  {
      // To be accessible from outside, this field must be public or protected.
      public string code;

      // To be accessible from outside, this field must be public or protected.
      public string name;

      public Employee(string code, string name)
      {
          this.code = code;
          this.name = name;
      }
  }


  class EmployeeTest
  {

      public static void Main(string[] args)
      {
          // Create Employee object
          Employee john = new Employee("E01", "John");

          // You can access the name of the employee
          // (name is a public field so you can access from outside).
          Console.WriteLine("Employee Name = " + john.name);

          // However, you can also assign a new value to the name field.
          // (This is obviously dangerous).
          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
    {
         // This field is private, does not allow access from outside.
        private string code;

        // This field is private, does not allow access from outside..
        private string name;


        // Declare a property, which is public, accessible from outside.
        public string Code
        {
            get
            {
                return this.code;
            }
            set
            {
                // value is a special keyword,
                // It implies the new value assigned to the field.
                this.code = value;
            }
        }

        // Declare a property, which is public, accessible from outside.
        // not allowed to assign new value.
        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)
        {

            // Create Employee object.
            Employee2 john = new Employee2("E01", "John");

          
            Console.WriteLine("Employee Code = " + john.Code);
            Console.WriteLine("Employee Name = " + john.Name);
            Console.WriteLine("-------");

            // Assign a new value to the Code property.
            john.Code = "E02";

            // Can not assign new value to Name.
            // john.Name = "Marry";

            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
    {

        // An abstract property
        public abstract string Name
        {
            get;
        }

        // An abstract property has both 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;

        // Implement the abstract property declared in the Animal class.
        public override string Name
        {
            get
            {
                return this.name;
            }
        }

        // Implement the abstract property declared in the Animal class.
        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
    {

        // An abstract property of 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;
 
       public string Color
       {
           get
           {
               return this.color;
           }
       }

       // Constructor.
       public Ball(String color)
       {
           this.color = color;
       }
   }

}