Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

namespace Samples {

 using System;

 public class Properties {

private int age;

private string name;

public Properties(string name) {

this.name = name;

}

public int Age {

get {

return age;

}

set {

age = value;

}

}

public string Name {

get {

return name;

}

}

 }

}

В указанном примере свойство

Age
имеет аксессоры
get
и
set
, поэтому можно читать или записывать в это свойство. Свойство
Name
, однако, создается один раз, когда создается новый экземпляр объекта свойств, после чего можно только прочитать значение
Name
. Свойства доступны, как если бы они были открытыми полями:

Properties props = new Properties("john");

props.Age = 21;

Console.WriteLine("My name is {0}, and I am {1} years old.", props.Name, props.Age);

Результатом этого кода является:

My name is john, and I am 21 years old.

Примечание. Имена свойств должны быть уникальными.

Как предполагает название, индексаторы позволяют легко индексировать атрибуты объектов. Предположим, что нам необходимо предоставить аналогичную функциональность, не создавая двух отдельных свойств. Можно проиндексировать имеющиеся поля, чтобы они были доступны с помощью некоторого ключа (ключ является значением, используемым для доступа к индексу, для массивов ключ является целым значением), или извлечь объявления двух свойств в примере выше и заменить их следующим:

public string this[string a] {

 get {

if (a.Equals("Age")) return int.ToString(age);

else if (a.Equals("Name")) return name;

else {

throw new Exception("can only accept 'name' or 'age' key");

}

 }

 set {

if (a.Equals("Age")) age = int.Parse(value);

else {

throw new Exception(a + " is read only or does not exist");

}

 }

}

Затем можно обратиться к атрибутам свойств следующим образом:

Properties props = new Properties("john");

props["Age"] = "21";

Console.WriteLine("my name is {0}, I am {1} years old.", props["Name"], props["Age"]);

В результате мы получим:

My name is john, I am 21 years old.

События

События C# предоставляют значительно более надежный и гибкий паттерн наблюдателя, чем в Java. Более того, они могут быть объявлены либо как поля, либо как свойства. Создание события является процессом из трех частей. Сначала мы получаем делегата, а затем событие, связанное с этим делегатом, и наконец, когда происходит некоторое действие, вызывается событие.

Проиллюстрируем это, удаляя исключения из класса

Properties
и используя вместо этого события. Наиболее привлекательным свойством событий является гибкость, которая наблюдается при использовании модели делегата. По сути можно использовать любую специальную сигнатуру, которую желательно связать с событием, а затем подписчик на событие должен предоставить целевой метод, который соответствует требуемому списку параметров. Создание этой специальной сигнатуры начинается с определения делегата в коде пространства имен. Для класса
Properties
необходимо, чтобы он инициировал строковые события, аналогичные исключениям, которые необходимо порождать:

public delegate void ObservableDelegate(string message);

Затем объявляется

delegate
как поле
event
в классе:

public event ObservableDelegate ExceptionEventListener;

Наконец, переписывается реализация индексатора для активизации приемника события всякий раз, когда возникает условие исключения:

public string this[string а] {

 get {

if (a.Equals("Age")) {

return int.ToString(age);

} else if (a.Equals("Name")) {

return name;

} else {

ExceptionEventListener(can only accept 'name' or 'age' key");

return null; // поток программы продолжается после того, как

// событие было инициировано, поэтому необходимо

// вернуть значение. В этом случае, так как ключ

// является недействительным (не 'name' или 'age'),

  • Читать дальше
  • 1
  • ...
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: