Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Структуры.

В отличие от классов и структур в C++, структуры C# семантически отличны от классов. В данном разделе будет освещен ряд таких отличий (Некоторые отличия будут указаны в последующих уроках).

Структурный тип

Основное отличие заключается в том, что структуры являются структурными типами (value types). Напоминаем, что объекты ссылочных типов создаются в куче, а объекты структурного типа создаются в стеке. Это означает, что при копировании двух объектов структур друг другу, вы получите не две ссылки на одно значение (случай для объектов классов), а два независимых объекта с одинаковым содержимым.

struct S
{
    public int i;
    public S(int n)
    {
        i = n;
    }
}

class MainClass
{
    static void Main()
    {
        S str = new S(76);
        Console.WriteLine(str.i); // 76
        S str1 = str;                // копируем объект
        str1.i = 77;
        Console.WriteLine(str.i); // 76
        Console.WriteLine(str1.i); // 77
    }
}

Объект структурного типа может присваиваться объекту типа object. В этом случае в куче создается временный объект, иммитирующий поведение ссылочного. В этот временный объект копируются данные из структурного, а сам объект помечается специальной отметкой о содержащемся в нем типе, чтобы тип объекта был известен среде. Этот процесс называется упаковкой (boxing), обратный процесс называется распаковкой (unboxing).

int i1 = 111;
object obj = i1;   // упаковка int в object
int i2 = (int) obj; // распаковка object в int (необходимо приводиться)

Поля и методы структур

Поля (нестатические) структур не могут инициализироваться при объявлении.

struct S
{
    public int i = 0; // Ошибка
}

Для структур запрещено объявление конструктора по умолчанию (его предоставляет среда).

struct S
{
    public int i;
    public S(int n)
    {
        i = n;
    }
    public S() // Ошибка
    {
        i = 0;
    }
}

Объекты структур можно создавать без использования оператора new, хотя при попытке его немедленного использования компилятор сообщит, что такое-то поле объекта неплохо бы проинициализировать.

struct S
{
    public int i;
    public S(int n)
    {
        i = n;
    }
}

class MainClass
{
    static void Main()
    {
        S str;
//      Console.WriteLine(str.i); - Ошибка, поле i не проинициализировано
        str.i = 77;
        Console.WriteLine(str.i); // 77
        S str1 = new S();// Вызывается системный конструктор по умолчанию
        Console.WriteLine(str1.i); // 0
    }
}
******
Структура не может иметь деструктор.
******


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru