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

Объекты

Определение класса или структуры подобно чертежу, на котором указаны действия, выполняемые типом. В сущности, объект является блоком памяти, выделенной и настроенной в соответствии с чертежом. Объекты также называют экземплярами. Они могут храниться либо в именованной переменной, либо в массиве или коллекции. Клиентский код — это код, использующий эти переменные для вызова методов и доступа к открытым свойствам объекта. В объектно-ориентированном языке, таком как C#, стандартная программа состоит из нескольких динамически взаимодействующих объектов.

Примечание.

Выделение и использование статических типов клиентским кодом немного отличается от моментов, описанных в данном разделе. Дополнительные сведения см. в разделе Статические классы и члены статических классов.

Экземпляры структуры и экземпляры класса

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

Экземпляры классов создаются с помощью оператора new. В следующем примере MyClass является типом, а mc1, mc2 и mc3 — экземплярами или объектами этого типа.

public class MyClass

{

//Properties, methods, events...

}

class Program

{

MyClass mc1 = new MyClass();

// mc! and mc2 point to the same object.

MyClass mc2 = mc1; 25

// mc3 is not the same object as mc1 and mc2.

MyClass mc3 = new MyClass();

}

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

public struct Person

{

public string Name;

public int Age;

}

public class MyClass

{

public void DoSomething()

{

// Create a struct instance by using "new".

// Memory is allocated on thread stack.

Person p1 = new Person();

p1.Age = 9;

p1.Name = "Alex";

// Create a struct object without using "new".

Person p2;

p2.Age = 7;

p2.Name = "Spencer";

// Create new Person and assign to existing instance.

// p3 is a separate object. Values of p2.Name and p2.Age

// are copied into p3.

Person p3 = p2;

}

}

Память для p1 и p2 выделяется в стеке потока вне зависимости от использования оператора new и освобождается, если метод DoSomething выходит из области действия. При выходе всех ссылок на объект из области действия среда CLR выполняет автоматическое освобождение памяти (сборку мусора), выделенной для экземпляра класса. Возможность детерминированного уничтожения объекта класса, имеющаяся в C++, в данном случае отсутствует.

Примечание.

В среде CLR процесс выделения и освобождения памяти в управляемой куче значительно оптимизирован. В большинстве случаев нет существенной разницы в затратах производительности на выделение экземпляра класса в куче и выделение экземпляра структуры в стеке.