Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3. Метод доступа set для свойства

Метод доступа set похож на метод, имеющий тип возвращаемого значения void. В нём используется неявный параметр value, тип которого соответствует типу свойства. В следующем примере метод доступа set добавляется в свойство Name:

class Person

{

private string name;

public string Name

{

get

{

return name;

}

set

{

name = value;

}

}

}

Когда свойству присваивается значение, выполняется вызов метода доступа set с помощью аргумента, предоставляющего новое значение. Пример:

Person person = new Person();

person.Name = "Teo"; // Вызывается "set" для отправки значения в свойство

//...

Console.WriteLine(person.Name); // Вызывается "get" для чтения значения

Использование имени неявного параметра value для объявления локальной переменной в методе доступа set является ошибкой.

Свойства можно пометить как public, private, protected, internal или protected internal. Эти модификаторы доступа определяют порядок доступа к свойству для пользователей класса. Методы доступа get и set могут иметь различные модификаторы доступа для одного свойства. Например, метод доступа get может иметь модификатор public для разрешения доступа только для чтения из типа, а метод доступа set может иметь модификатор private или protected.

Свойство можно объявить как статическое свойство при помощи ключевого слова static. При этом свойство становится доступным для вызова в любое время, даже если экземпляр класса отсутствует.

Свойство можно пометить как статическое свойство при помощи ключевого слова virtual. Это позволяет производным классам переопределять поведение свойства при помощи ключевого слова override.

Свойство, переопределяющее виртуальное свойство, может также быть sealed, что указывает на то, что для производных классов оно более не является виртуальным. И наконец, свойство можно объявить как abstract. Это означает, что в классе отсутствует реализация, поэтому производные классы должны создавать свою собственную реализацию.

Использование модификатора vitrual, abstract или override для метода доступа свойства static является ошибкой.

4. Свойства интерфейса

Свойства можно объявлять в interface. Ниже приведен примёр метода доступа индексатора интерфейса:

public interface ISampleInterface

{

string Name

{

get;

set;

}

}

Метод доступа свойства интерфейса не имеет тела. Поэтому методы доступа предназначены для того, чтобы указывать, доступно ли свойство для чтения и записи, только для чтения или только для записи.

5. Автоматически реализуемые свойства

В языке C# 3.0 и более поздних версиях автоматически реализуемые свойства способствуют более лаконичному объявлению свойств, если в методах доступа не требуется дополнительная логика. Они также поддерживают создание объектов клиентским кодом. При объявлении свойства, как показано в следующем примере, компилятор создает закрытое анонимное резервное поле, которое доступно только с помощью методов get и set свойства:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class Customer

{

// Автоматически реализуемые свойства

public double TotalPurchases { get; set; }

public string Name { get; set; }

public int CustomerID { get; set; }

// Конструктор

public Customer(double purchases, string name, int ID)

{

TotalPurchases = purchases;

Name = name;

CustomerID = ID;

}

// Методы

public string GetContactInfo() { return "ContactInfo"; }

public string GetTransactionHistory() { return "History"; }

}

class Program

{

static void Main()

{

// Инициализируем новый объект класса

Customer cust1 = new Customer(4987.63, "Northwind", 90108);

// Меняем переменную через автоматически реализуемое свойство

cust1.TotalPurchases += 499.99;

Console.WriteLine(cust1.TotalPurchases);

Console.WriteLine("Для продолжениея нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

/* Выведет:

* 5487,62

* Для продолжения нажмите любую клавишу . . .

*/

Класс, показанный в предыдущем примере, является изменяемым. Значения объектов после их создания могут изменяться клиентским кодом. В сложных классах, поддерживающих значительные возможности (методы) и содержащие данные, часто необходимо определять закрытые свойства. Однако в случае небольших классов или структур, которые лишь инкапсулируют набор значений (данных) и не поддерживают значительных возможностей, рекомендуется использовать неизменяемые объекты, создаваемые посредством объявления метода доступа set с модификатором private.

Атрибуты разрешены в автоматически реализуемых свойствах, но явно не в резервных полях, так как они недоступны из исходного кода. Если в резервном поле свойства требуется использовать атрибут, просто создаём регулярное свойство.