Zmienne zadeklarowane wewnątrz klasy nazywamy polami. Właściwości są rozszerzeniem dla pól i są dostępne przy użyciu tej samej składni. Używają one akcesorów, dzięki czemu pola prywatne są dostępne z zewnątrz klasy.

Właściwości nie służą do przechowywania wartości. Przy pomocy acesorów mają dostęp do pól, które reprezentują.

Załóżmy, że mamy zdefiniowaną klasę Car, która ma prywatne pola: marka, model, silnik. Pola te nie są bezpośrednio dostęp z zewnątrz danej klasy ale używając właściwości możemy uzyskać do nich dostęp.


Akcesory

Akcesor właściwości zawiera instrukcje do wykonania, które pozwalają na odczyt albo zapis wartości pola. Deklaracje właściwości mogą zawierać akcesor get, set lub oba”

namespace Wlasciwosci
{
    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            // 'Car.brand' nie jest dostępne z powodu poziomu dostępu
            car.brand = "Audi";
            // spróbujmy teraz uzyskać dostęp
            car.Brand = "Audi";
        }
    }
    class Car
    {
        // Pola nie są dostępne z zewnątrz
        private string brand;
        private string model;
        private double capacity;
        // Deklaracja właściwości Brand z dostępem do pola prywatnego brand
        public string Brand
        {
            get
            {
                return brand;
            }
            set
            {
                brand = value;
            }
        }
    }
}
Przykład zastosowania właściwości:
using System;
namespace Wlasciwosci
{
    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            // Ustawiamy wartości w polach prywatnych za pomocą właściowości
            car.Brand = "Audi";
            car.Model = "RS6";
            car.Capacity = 4.0;
            Console.WriteLine("Info: {0}", car.ToString());
            Console.ReadKey();
            // Wynik działania programu
            // Info: Marka: Audi | Model: RS6 | Pojemnosc: 4 l
        }
    }
    class Car
    {
        // Pola nie są dostępne z zewnątrz
        private string brand = "N.A";
        private string model = "N.A";
        private double capacity = 0.0;
        // Deklaracja właściwości Brand z dostępem do pola prywatnego brand
        public string Brand
        {
            get
            {
                return brand;
            }
            set
            {
                brand = value;
            }
        }
        // Można również dokonać zapisu w jednej linii
        public string Model { get { return model; } set { model = value; } }
        // Oraz kolejna forma zapisu
        public double Capacity
        {
            get { return capacity; }
            set { capacity = value; }
        }
        public override string ToString()
        {
            string returnedString = string.Format("Marka: {0} | Model: {1} | Pojemnosc: {2} l", brand, model, capacity);
            return returnedString;
        }
    }
}

Właściwości abstrakcyjne

Klasy abstrakcyjne mogą posiadać abstrakcyjne właściwości, które muszą być zaimplementowane w klasach pochodnych. Poniższy program pokazuje zastosowanie abstrakcyjnych właściwości:

using System;
namespace WlasciwosciAbstrakcja
{
    class Program
    {
        static void Main(string[] args)
        {
            SuperCar sc = new SuperCar();
            sc.Brand = "Pagani";
            sc.Model = "Zonda F";
            sc.Capacity = 7.3;
            Console.WriteLine("Info: {0}", sc.ToString());
            Console.ReadKey();
            // Wynik działania programu
            // Info: Marka: Pagani | Model: Zonda F | Pojemnosc: 7.3 l
        }
    }
    abstract class Car
    {
        private string brand = "N.A";
        private string model = "N.A";
        private double capacity = 0.0;
        // Deklaracja właściwości Brand z dostępem do pola prywatnego brand
        public abstract string Brand
        {
            get;
            set;
        }
        public abstract string Model
        {
            get;
            set;
        }
        public abstract double Capacity
        {
            get;
            set;
        }
    }
    class SuperCar: Car
    {
        private string brand;
        private string model;
        private double capacity;
        // Celowo przedstawiam różne zapisy, żebyś wybrał ten, który najbardziej Ci odpowiada
        public override string Brand { get { return brand; } set { brand = value; } }
        public override string Model
        {
            get
            {
                return model;
            }
            set
            {
                model = value;
            }
        }
        public override double Capacity
        {
            get { return capacity; }
            set { capacity = value; }
        }
        public override string ToString()
        {
            string returnedString = string.Format("Marka: {0} | Model: {1} | Pojemnosc: {2} l", brand, model, capacity);
            return returnedString;
        }
    }
}