C#. Урок 2. Типы данных. Часть 2

Уроки для опытных   1 февраля 2013  Автор статьи:  

Продолжаем более подробно знакомиться с типами данных.

Для начала рассмотрим 2 примера — со структурами:

struct Point
{
int x;
int y;
int z;
}
Point point1 = new Point();
point1.x = 10;
point1.y = 1;
point1.y = 4;
Point point2 = point;

и классами:

class Point
{
int x;
int y;
int z;
}
Point point1 = new Point();
point1.x = 10;
point1.y = 1;
point1.y = 4;
Point point2 = point;

Что же произойдет, если в обоих случаях написать:

point1.x=0;
point1.z=1;
point1.y=2;

Structure Сlass

Так как структуры, как и все value типы, хранятся в стеке, то в первом случае при создании структуры point2, происходит полное копирование структуры point1 в новую область памяти. И после изменения полей структуры point1 значения полей point2 не меняются. Во втором случае происходит копирование указателя, хранящегося в стеке, поэтому при изменении полей экземпляра point1 мы меняем соответствующие значения у point2.
К основным различиям между value и reference типами можно отнести: отсутствие потомков у структур (наличие у классов), размещение структур в стеке, возможность инициализации полей  при объявлении у классов, отсутствие абстрактных и виртуальных членов у структур, невозможность хранения null.
Однако для последнего есть исключения — так называемые Nullable типы, т. е. типы, допускающие значения null. Объявление возможно двумя способами:

//тип? имя = значение;
//Nullable <тип> имя = значение;
Nullable x1 = 2.5;
double? x2 = null;

Так же для этих типов существуют соответствующие операции:

//получение значения
float x = x1.Value;
float y = (float)x1.Value; //явное приведение типов
//проверка на наличие значения
if (x1.HasValue)
{
...
}

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

var x = 2;

Также присутствует особый тип dynamic. Суть его в том, что компилятор будет пропускать проверки типов при компиляции и осуществлять их только при выполнении операции.

struct Point
{
int x;
}
Point p = new Point();
dynamic pNew = p;
pNew.x = 3;
pNew.y = "Red";

Ошибка произойдет при попытке при попытке присвоить полю y значение типа string, так как такого поля нет. Это показывает, что dynamic используется в случае, когда программист точно уверен, какие поля и свойства есть у объекта, что облегчает работу с внешними приложениями, например Excel.

  • Андрей

    В 11 строке нужно Point исправить на Point1.
    И на x, y, z желательно поставить public.

    Спасибо.

Научиться программировать

  • на Delphi

  • на Java

  • на C++