FER / ZPR /  Ergonomija
Struktura programa Nizovi
Za napredne
An Introduction to C# Generics je članak o najmoćnijem novitetu u C# 2.0 jeziku. Generics su type-safe podatkovne strukture kojima nemoramo specificirati stvarni tip podatka. Dosta slična mogućnost u C++ jeziku su standardni predlošci. Povećavaju performanse i kvalitetu koda jer omogućuju ponovno korištenje procesnih algoritama.

» Pročitaj članak

Tipovi podataka

C# spada u strongly typed jezike, tj. sve varijable i objekti moraju imati deklariran tip. Varijablama možemo zadati da imaju neki od ugrađenih tipova, poput int ili char tipa, ili neki korisnički-definirani tip poput klase ili sučelja. Drugi način podjele je na:

  • vrijednosne tipove (value type)
  • referentne tipove (reference type)

Vrijednosni tipovi

Vrijednosni tipovi se dijele su dvije glavne kategorije:
  • Strukture
  • Pobrojani tip
Strukture je dalje dijele na:
  • Numeričke tipove
  • Integralne tipove
  • Tipove sa pomičnim zarezom
  • Decimal
  • Bool
  • Korisnički definirane strukture

Varijable koje imaju vrijednosni tip direktno sadržavaju vrijednost. Kad pridružujemo jednu varijablu vrijednosnog tipa drugoj varijabli, vrijednost se kopira. Ovo je različito od slučaja kad su varijable referentnog tipa kada se kopira samo referenca, ali ne i sami objekt.

Za razliku od referentnih tipova, tip nije moguće proširiti (naslijediti), ali strukture još uvijek mogu implementirati sučelja. Isto tako, za razliku od referentnih tipova, vrijednosni tipovi ne mogu sadržavati null kao vrijednost, ali sa dolaskom novog frameworka 2.0, dodan je nullable type koji nam omogućuje da vrijednosnom tipu pridružimo null.

Integralni tipovi

Sljedeća tablica prikazuje veličinu i raspon integralnih tipova:

Tip Raspon Veličina
sbyte -128 to 127 Signed 8-bit integer
byte 0 to 255 Unsigned 8-bit integer
char U+0000 to U+ffff Unicode 16-bit character
short -32,768 to 32,767 Signed 16-bit integer
ushort 0 to 65,535 Unsigned 16-bit integer
int -2,147,483,648 to 2,147,483,647 Signed 32-bit integer
uint 0 to 4,294,967,295 Unsigned 32-bit integer
long -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Signed 64-bit integer
ulong 0 to 18,446,744,073,709,551,615 Unsigned 64-bit integer

Tipovi s pomičnim zarezom

Sljedeća tablica prikazuje preciznost i procijenu raspona tipova s pomičnim zarezom.

 
Tip Raspon Preciznost
float ±1.5e-45 to ±3.4e38 7 digits
double ±5.0e-324 to ±1.7e308 15-16 digits

Decimal

Decimal je 128-bitni vrijednosni tip. U usporedbi sa tipom s pomičnim zarezom, decimalni tip ima veću preciznost i manji raspon, što ga čini pogodnijim za financijske i novčane proračune. Procijena raspona za decimalni tip se nalazi u sljedećoj tablici.
 
Tip Raspon Preciznost
decimal ±1.0 × 10e-28 to ±7.9 × 10e28 28-29 significant digits

Bool

Ključna riječ bool je alias za System.Boolean tip. Koristi se za deklariranje varijabli koje mogu pohranjivati Boolean vrijednosti, true i false. Nekoj bool varijabli se mogu pridružiti i izrazi koji kao rezultat vraćaju bool vrijednost, kao u sljedećem primjeru:
// keyword_bool.cs
using System;
public class MyClass
{
    static void Main()
    {
        bool i = true;
        char c = '0';
        Console.WriteLine(i);
        i = false;
        Console.WriteLine(i);

        bool Alphabetic = (c > 64 && c < 123);
        Console.WriteLine(Alphabetic);
    }
}
Kao rezultat se dobiju tri retka u kojima piše True, False, False.

Struct

Korisnički definirane strukture se koriste za enkapsulaciju manje grupe povezanih varijabli, poput koordinata pravokutnika ili karakteristika nekog predmeta iz skladišta. Sljedeći primjer prikazuje deklaraciju jednostavne strukture:
public struct Book
{
    public decimal price;
    public string title;
    public string author;
}
Strukture mogu sadržavati i konstruktore, konstante, atribute (fields), metode, svojstva, indeksere, operatore, događaje i ugniježđene tipove, premda, ako vam je potrebno više ovih elemenata, trebali biste razmislite da stvorite klasu umjesto strukture.

Pobrojani tip

Pobrojani tip ili enumeracija se stvara pomoću enum ključne riječi, a koristi se za definiranje seta konstanti. Svaka enumeracija ima ispod sebe neki integralni tip (osim char tipa). Defaultni tip je int. Po defaultu, prva konstanta ima vrijednost 0, a sve ostale po 1 više od prethodnog, pa tako u sljedećem primjeru
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
konstanta Sat ima vrijednost 0, Sun ima 1, Mon ima 2, itd. To možemo i promijeniti tako da konstantama eksplicitno zadamo vrijednost. Ona sljedeća konstanta, koja nema zadanu eksplicitnu vrijednost, ima vrijednost za 1 veću od prethodne konstante. U sljedećem primjeru
enum Days {Sat = 1, Sun, Mon, Tue = 2, Wed, Thu, Fri};
konstanta Sat ima vrijednost 1, Sun ima 2, Mon ima 3, Tue ima 2, Wed ima 3, itd.

Kod ovog zadnjeg primjera za enumeracije vidimo kako promijeniti tip koji se nalazi ispod konstanti u enumeraciji. Stavili smo da su tipa long. Primijetite također da, iako su tipa long, konstante iz enumeracije je potrebno eksplicitno pretvoriti u long tip prilikom pridruživanja long varijabli.
// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest 
{
    enum Range :long {Max = 2147483648L, Min = 255L};
    static void Main() 
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}

Referentni tipovi

Varijable referentnog tipa čuvaju samo reference na stvarne podatke. Razliku u odnosu na vrijednosne tipove smo već spomenuli kod opisa vrijednosnih tipova. Osnovna podjela referentnih tipova je na:
  • Klase
  • Sučelja
  • Delegate
Postoje i dva već ugrađena referentna tipa:
  • Object
  • String
Sve ove referentne tipove ćemo detaljnije upoznati kroz sljedećih par poglavlja. Prije toga, pogledajmo što se događa kad vrijednosne tipove želimo koristiti kao objekte.

Boxing i unboxing

Boxing je postupak koji je obavlja kad vrijednosni tip "pakiramo" u referentni tip Objekt. To omogućuje vrijednosnom tipu da ga stavimo na gomilu (heap) kojom upravlja garbage collector. Boxing vrijednosnog tipa alocira instancu objekta na gomili i kopira vrijednost u novi objekt.

Pogledajmo sljedeću deklaraciju varijable vrijednosnog tipa:
int i = 123;
Sljedeća naredba implicitno primjenjuje boxing operaciju nad varijablom i:
object o = i;  // implicit boxing
Rezultat ove naredbe se može vidjeti na sljedećoj slici:

Boxing

U sljedećem primjeru konvertiramo integer varijablu i u objekt o pomoću boxinga. Nakon toga, varijabli i promijenimo vrijednost iz 123 u 456. Primjer pokazuje kako originalni vrijednosni tip i novi boxed objekt koriste različite memorijske lokacije (ispišu se vrijednosti 456 i 123).
class TestBoxing  
{
    static void Main() 
    {
        int i = 123;
        object o = i;  // implicit boxing
        
        i = 456;  // change the contents of i

        System.Console.WriteLine("The value-type value = {0}", i);
        System.Console.WriteLine("The object-type value = {0}", o);
    }
}
Unboxing je eksplicitna konverzija iz tipa objekt u vrijednosni tip. Unboxing operacija se sastoji od:
  • provjere da je instanca objekta boxed vrijednost zadanog vrijednosnog tipa
  • kopiranja vrijednosti iz instance u varijablu vrijednosnog tipa
Sljedeći primjer prikazuje i boxing i unboxing operacije:
int i = 123;      // a value type
object o = i;     // boxing
int j = (int) o;  // unboxing
Na slici je prikazano sto se događa u memoriji kad se izvrše ove tri naredbe.

Unboxing

na vrh

Struktura programa Nizovi

 
Copyright © 2006, Mario Bošnjak