Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
public FailSoftArray(int size) {
a = new int [size];
Length = size;
}
// Автоматически реализуемое и доступное
//только для чтения свойство Length,
public int Length { get; private set; }
// Автоматически реализуемое и доступное
//только для чтения свойство Error,
public bool Error { get; private set; }
// Это индексатор для массива FailSoftArray.
public int this[int index] {
// Это аксессор get.
get {
if(ok(index)) {
Error = false;
return a[index];
}
else {
Error = true;
return 0;
}
}
// Это аксессор set.
set {
if(ok(index)) {
a[index] = value;
Error = false;
}
else
Error = true;
}
}
// Возвратить логическое значение true, если
// индекс находится в установленных границах,
private bool ok(int index) {
if(index >= 0 & index < Length) return true;
return false;
}
}
//Продемонстрировать применение усовершенствованного
//отказоустойчивого массива,
class FinalFSDemo {
static void Main() {
FailSoftArray fs = new FailSoftArray(5);
// Использовать свойство Error,
for(int i=0; i < fs.Length + 1; i++) {
fs[i] = i * 10;
if(fs.Error)
Console.WriteLine("Ошибка в индексе " + i);
}
}
}
Этот вариант класса FailSoftArray
действует таким же образом, как и предыдущий, но в нем отсутствуют поддерживающие поля, объявляемые явно.
На применение модификаторов доступа в аксессорах накладываются следующие ограничения. Во-первых, действию модификатора доступа подлежит только один аксессор: set
или get
, но не оба сразу. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе. (Подробнее об интерфейсах речь пойдет в главе 12.)
Применение индексаторов и свойств
В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса RangeArray
, в котором индексаторы и свойства используются для создания типа массива с пределами индексирования, определяемыми пользователем.
Как вам должно быть уже известно, индексирование всех массивов в C# начинается с нуля. Но в некоторых приложениях индексирование массива удобнее начинать с любой произвольной точки отсчета: с 1 или даже с отрицательного числа, например от -5 и до 5. Рассматриваемый здесь класс RangeArray
разработан таким образом, чтобы допускать подобного рода индексирование массивов.
Используя класс RangeArray
, можно написать следующий фрагмент кода.
RangeArray ra = new RangeArray(-5, 10); // массив с индексами от -5 до 10
for(int i=-5; i <= 10; i++) ra[i] = i; // индексирование массива от -5 до 10
Нетрудно догадаться, что в первой строке этого кода конструируется объект класса RangeArray с пределами индексирования массива от -5 до 10 включительно. Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект ra
будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10.
Ниже приведен полностью класс RangeArray
вместе с классом RangeArrayDemo
, в котором демонстрируется индексирование массива в заданных пределах. Класс RangeArray
реализован таким образом, чтобы поддерживать массивы типа int
, но при желании вы можете изменить этот тип на любой другой.
/* Создать класс со специально указываемыми пределами индексирования массива. Класс RangeArray допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса RangeArray указываются начальный и конечный индексы. Допускается также указывать отрицательные индексы. Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */
using System;
class RangeArray {
// Закрытые данные.
int[] a; // ссылка на базовый массив
int lowerBound; // наименьший индекс int
int upperBound; // наибольший индекс
// Автоматически реализуемое и доступное
//только для чтения свойство Length,
public int Length { get; private set; }
// Автоматически реализуемое и доступное
//только для чтения свойство Error,
public bool Error { get; private set; }
// Построить массив по заданному размеру,
public RangeArray(int low, int high) {
high++;
if (high <= low) {
Console.WriteLine("Неверные индексы");
high = 1; // создать для надежности минимально допустимый массив
low = 0;
}
a = new int[high - low];
Length = high - low;
lowerBound = low;
upperBound = --high;
}
// Это индексатор для класса RangeArray.
public int this[int index] {
// Это аксессор get.
get {
if (ok(index)) {
Error = false;
return a[index - lowerBound];
}
else {
Error = true;
return 0;
}
}
// Это аксессор set.
set {
if (ok(index)) {
a[index - lowerBound] = value;
Error = false;
}
else
Error = true;
}
}
// Возвратить логическое значение true, если
// индекс находится в установленных границах,
private bool ok(int index) {
if (index >= lowerBound & index <= upperBound) return true;
return false;
}
}
// Продемонстрировать применение массива с произвольно
Интервал:
Закладка: