Hướng dẫn sử dụng C# Property
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- C# Property

Property là một thành viên (member) của một class, interface. Nó là mở rộng của một trường (field). Property cho phép bạn truy cập vào một trường hoặc thay đổi giá trị của trường đó, mà không cần thiết phải truy cập trực tiếp vào trường.

Bạn có thể tạo một Property chỉ cho phép truy cập vào một trường, không cho phép thay đổi giá trị của trường, và ngược lại. Đây chính là điểm lợi hại nhất của một Property.

Với trường (field), nếu bạn có thể truy cập vào nó từ bên ngoài, bạn cũng có thể thay đổi giá trị của nó, điều này rõ ràng là nguy hiểm, hãy xem ví dụ:
Employee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
  class Employee
  {
      // Để có thể truy cập ở bên ngoài, trường này phải public hoặc protected.
      public string code;

      // Để có thể truy cập ở bên ngoài, trường này phải public hoặc protected.
      public string name;

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


  class EmployeeTest
  {

      public static void Main(string[] args)
      {
          // Tạo một đối tượng Employee.
          Employee john = new Employee("E01", "John");

          // Bạn có thể truy cập vào tên của nhân viên
          // (name là trường public vì vậy bạn có thể truy cập ở bên ngoài).
          Console.WriteLine("Employee Name = " + john.name);

          // Tuy nhiên bạn cũng có thể sét giá trị mới cho trường name.
          // (Điều này rõ ràng là nguy hiểm).
          john.name = "Marry";

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

          Console.Read();
      }
  }

}
Property là một giải pháp để giải quyết vấn đề nêu trên. Dưới đây là một ví dụ sử dụng Property Code, Name để truy cập vào trường code, name của class Employee2.
Employee2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee2
    {
         // Trường này là private, không cho phép truy cập từ bên ngoài.
        private string code;

        // Trường này là private, không cho phép truy cập từ bên ngoài.
        private string name;


        // Khai báo một property, là public, có thể truy cập từ bên ngoài.
        public string Code
        {
            get
            {
                return this.code;
            }
            set
            {
                // value là một từ khóa đặc biệt,
                // nó ám chỉ giá trị mới được gán cho thuộc tính.
                this.code = value;
            }
        }

        // Khai báo một property, là public, chỉ cho phép truy cập
        // không cho phép gán giá trị mới.
        public string Name
        {
            get
            {
                return this.name;
            }
        }



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

}
Test sử dụng các property của Employee2:
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)
        {

            // Tạo một đối tượng Employee.
            Employee2 john = new Employee2("E01", "John");

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

            // Gán giá trị mới cho thuộc tính Code.
            john.Code = "E02";

            // Không thể gán giá trị mới cho Name.
            // john.Name = "Marry";

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

            Console.Read();
        }
    }

}
Chạy ví dụ:

2- Property trừu tượng (Abstract Property)

Property sử dụng dụng để setget giá trị của một trường, về bản chất nó được coi là một phương thức đặc biệt, vì vậy nó cũng có thể khai báo trìu tượng (abstract), và nó sẽ được thực hiện (implements) tại một class con. Class có thuộc tính (property) khai báo là abstract thì nó phải khai báo là abstract. Các thuộc tính trừu tượng cũng có thể được khai báo trong Interface.
Animal là một class có khai báo 2 thuộc tính trừu tượng (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
    {

        // Một thuộc tính trìu tượng
        public abstract string Name
        {
            get;
        }

        // Một thuộc tính trìu tượng có cả set & get
        public abstract int Age
        {
            get;
            set;
        }
    }

}
Class Cat mở rộng từ Animal, và triển khai các thuộc tính trừu tượng khai báo trong 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;

        // Triển khai property trừu tượng khai báo trong class Animal.
        public override string Name
        {
            get
            {
                return this.name;
            }
        }

        // Triển khai property trừu tượng khai báo trong class 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 trong Interface

Bạn cũng có thể khai báo Property trong một Interface, các thuộc tính này sẽ được thực hiện (implements) tại các class con.
IColor.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    interface IColor
    {

        // Một thuộc tính trừu tượng của Interface.
        String Color
        {
            get;
        }
    }

}
Class Ball thi hành Interface IColor, nó thực hiện (implements) thuộc tính trừu tượng khai báo trong 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;

       // Triển khai property được khai báo trong Interace IColor
        // (Không được viết từ khóa override ở đây,
        // vì nó triển khai property của Interface).
       public string Color
       {
           get
           {
               return this.color;
           }
       }

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

}