Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# / Лекции / лекция 5_new / Интерфейсы_1.pptx
Скачиваний:
49
Добавлен:
24.02.2016
Размер:
190.38 Кб
Скачать

Структуры

Т. к. структура является размерным типом, то экземпляр структуры хранит значение своих элементов, а не ссылки на них

Располагается в стеке данных, а не в куче.

Структура не может участвовать в иерархии наследования, а может только реализовывать интерфейсы.

Структуре запрещено:

определять конструктор по умолчанию, т.к. он определен неявно и присваивает всем своим элементам значения по умолчанию (нули соответствующего типа);

определять деструктор( это бессмысленно)

[атрибуты][спецификаторы] struct имя_структуры [: интерфейсы]

{

тело_структуры

}

Из спецификаторов доступа допускается использовать только public, internal и для вложенных структур -private.

Структуры не могут быть абстрактными, т.к.по умолчанию они бесплодны.

Интерфейсы, реализуемые структурой, перечисляются через запятую.

Тело структуры может содержать: константы, поля, конструкторы, методы, свойства, индексаторы, операторные методы, вложенные типы и события.

При описании структуры задавать значение по умолчанию можно только для статических полей (остальным полям с помощью конструктора по умолчанию будут присвоены нули для полей размерных типов и null для полей ссылочных типов).

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

Для членов структуры недопустимо использовать спецификаторы protected и protected internal (т. к. структуры не могут участвовать в иерархии).

Методы структур не могут быть абстрактными и виртуальными.

Переопределяться могут только те методы, которые унаследованы от базового класса object.

Рассмотрим пример структуры SPoint, реализующей стандартный интерфейс IComparable. В данной структуре определены:

1)поля x и у;

2)конструктор, в который передаются заданные координаты точки;

3)метод Dlina, который позволяет вычислить расстояние от точки до начала координат;

4)перегружен метод ToString базового класса object;

5)реализован метод CompareTo стандартного интерфейса IComparable;

6)перегружены операции == и !=.

struct SPoint : IComparable

{

//описание структуры

 

 

public int x, y;

 

 

 

 

 

 

 

public SPoint(int x, int y)

{

this.x = x; this.y = y;

}

 

public double Dlina()

//метод

 

 

 

 

 

{

return Math.Sqrt(x * x + y * y);

}

 

 

 

public override string ToString()

{

return "(" + x.ToString() + ", " + y.ToString()

+ ")“;

}

 

 

 

 

 

 

 

 

public int CompareTo(object obj)

{

 

 

 

 

SPoint b = (SPoint)obj;

 

if (this.Dlina() == b.Dlina()) return 0;

 

 

else if (this.Dlina() > b.Dlina()) return 1;

else return -1;

}

public static bool operator ==(SPoint a, SPoint b)

 

 

 

{

return (a.CompareTo(b) == 0);

}

 

 

 

public static bool operator !=(SPoint a, SPoint b)

 

 

 

{

return (a.CompareTo(b) != 0);

} }

 

 

 

class Program

{

 

 

 

 

 

 

 

static void Main()

{

 

 

 

 

 

 

//создание и заполнение массива структур

 

 

 

SPoint[] a = new SPoint[4];

 

 

 

 

 

a[0] = new SPoint(-3, 0);

a[1] = new SPoint(-0, 3);

a[2] = new SPoint(3, 4); a[3]

= new SPoint(0, 1);

 

 

 

 

 

 

 

//сравнение двух структур

 

 

 

 

 

if (a[0] == a[1])

Console.WriteLine("точки {0} и {1} равноудалены от начала

координат\n”, a[0].ToString(), a[1].ToString());

 

 

 

else Console.WriteLine("точки {0} и {1} не равноудалены от начала координат\n",

a[0].ToString(), a[1].ToString());

Array.Sort(a);

//сортировка массива структур

foreach (SPoint x in a) //просмотр массива структур

 

 

 

{

Console.WriteLine("Точка: " + x.ToString());

 

 

 

Если оператор new не используется, то структура все равно создается, но не инициализируется.

//последовательность команд будет ошибочна:

SPoint one; Console.WriteLine(one.ToString());

Если при объявлении структуры не был вызван конструктор, то поля нужно инициализировать вручную:

SPoint one;

one.x=100; one.y=100; Console.WriteLine(one.ToString());

Т. к. структуры являются размерными типами, то присваивание одной структуры другой создает копию экземпляра структуры (отличие структуры от класса).

SPoint one=new SPoint(); //вызов конструктора по умолчанию SPoint two=new SPoint(1,1); //вызов собственного конструктора

Console.WriteLine(one.ToString());

Console.WriteLine(two.ToString()); one=two; one.x=100; Console.WriteLine(one.ToString()); Сonsole.WriteLine(two.ToString());

Класс или структура???

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

Во всех остальных случаях эффективнее использовать классы.

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

Соседние файлы в папке лекция 5_new