Референтни типови података
Променљиве референтних типова чувају референце на своје податке, које се називају објекти. Објекти референтних типова се чувају на хипу (енгл. heap). Када креираш објекат референтног типа, на стеку (енгл. stack) се чува само меморијска адреса која показује на локацију на хипу где се налази стварни објекат.
Када доделиш једну променљиву референтног типа другој, обе променљиве ће показивати на исти објекат на хипу. Промене направљене путем једне променљиве биће видљиве и кроз другу променљиву. Референтне променљиве могу бити null, што значи да не показују ни на један објекат. Покушај приступа објекту референтног типа који је null изазваће грешку, односно изузетак NullReferenceException. О изузецима учићеш у поглављу Руковање изузецима. Хипом управља општа језичка извршна платформа CLR, па ће објекти на хипу који више нису потребни бити аутоматски обрисани од стране сакупљача смећа (енгл. GC, Garbage Collector).
Референтни тип може бити класа, интерфејс, низ, делегат или динамички тип.
flowchart TD
a["Референтни тип"] --> b["Тип класе"]
a["Референтни тип"] --> c["Тип интерфејса"]
a["Референтни тип"] --> d["Тип низа"]
a["Референтни тип"] --> e["Тип делегата"]
a["Референтни тип"] --> f["Динамички тип"]
Текст испод, који описује референтне типове, можеш за сада сматрати
информативним. О класама ћеш почети да учиш тек од следећег поглавља.
Класа дефинише структуру података која садржи атрибуте (константе и поља), методе (методе, својства, догађаје, индексере, операторе, конструкторе и финализаторе) и угнежђене типове. Типови класа подржавају наслеђивање, механизам помоћу којег изведене класе могу проширити и специјализовати базне класе. Више о наслеђивању учићеш у наредним поглављима. Инстанце типова класа се креирају помоћу израза за креирање објеката. Тип класе може бити:
flowchart TD
b["Тип класе"] --> b1["Class"]
b["Тип класе"] --> b2["Object"]
b["Тип класе"] --> b3["String"]
Одређени унапред дефинисани типови класа имају посебно значење у програмском језику C#:
| Тип класе | Опис |
|---|---|
System.Object | Основна класа свих других типова. |
System.String | Стринг тип. |
System.ValueType | Основна класа свих вредносних типова. |
System.Enum | Основна класа свих енумерацијских типова. |
System.Array | Основна класа свих типова низа. |
System.Delegate | Основна класа свих типова делегата. |
System.Exception | Основна класа свих типова изузетака. |
Object тип је основна класа свих осталих типова. Сваки тип директно или индиректно потиче од типа класе Object. Кључна реч Object је псеудоним за унапред дефинисану класу System.Object.
Стринг је тип запечаћене класе који наслеђује директно из класе System.Object. Инстанце ове класе представљају низове UNICODE карактера. Кључна реч string је псеудоним за унапред дефинисану класу System.String. Вредности типа стринг се пишу се као стринг литерали.
Интерфејс дефинише "уговор" кога класа или структура мора да имплементира. Интерфејс може наследити више интерфејса, а класа или структура могу имплементирати више интерфејса. О интерфејсима учићеш у лекцији Интерфејси.
Низ је структура података која садржи нула или више променљивих, којима се приступа преко индекса. Променљиве садржане у низу, које се називају елементи низа, увек су истог типа, а овај тип се назива тип елемента низа:
flowchart TD
d["Тип низа"] --> d1["Вредносни тип"]
d["Тип низа"] --> d2["Тип класе"]
d["Тип низа"] --> d3["Тип интерфејса"]
d["Тип низа"] --> d4["Тип делегата"]
d["Тип низа"] --> d5["Динамички тип"]
d["Тип низа"] --> d6["Параметар типа"]
d["Тип низа"] --> d7["*Показивачки тип"]
Делегат је структура података која упућује на једну или више метода. Најближи еквивалент делегату у програмском језику C је показивач на функцију. Показивач на функцију може да референцира само статичке функције, а делегат може да референцира и статичке методе и методе инстанце.
Динамички тип, као и object, може референцирати било који објекат. Када се операције примењују на изразе типа dynamic, њихово разрешење се одлаже док се програм не покрене. Ако се операција не може легитимно применити на референцирани објекат, током процеса компајлирања се не појављује грешка, већ се избацује изузетак у време извршавања програма.