Upload
others
View
15
Download
1
Embed Size (px)
Citation preview
Visoka tehnička škola Niš
Studijski program: Savremene računarske tehnologije
Prof. dr Zoran Veličković, dipl. inž. el.
2019/2020.
Predmet: .NET tehnologije
.NET tehnologije
Osnove jezika C#
Tipovi, klase, objekti, promenljive, operatori, regularni izrazi, naredbe grananja i pretprocesorske direktive
(4)
Prof. dr Zoran Veličković, dipl. inž. el.
Sadržaj Osnovni jezika C#
Tipovi, klase i objekti u C#
Blokovi u C#
Promenljive u C#
Znakovni nizovi u C#-u
Svojstvo i metode za stringove
Primeri korišćenja metode za stringove
Regularni izrazi
Upravljanje programskim tokom u C#-u
Poziv metode – bezuslovni skok
Naredba uslovnog skoka: if - else
Switch naredba
Naredba ponavljanja: for i foraech
Naredbe break i comtinue
Operatori u C#-u
Relacioni operatori
Ternarni operator
Operator is
Pretprocesorske direktive
Tipovi, klase i objekti u C#
TIPOVI su osnova OO programiranja i uobičajeno predstavljaju neku stvar.
Tip zapravo definiše OPŠTA SVOJSTVA i PONAŠANJE stvari.
Kao i Javi, tip se u C# definiše pomući KLASA, a svaka pojedinačna insatnaca klase se
naziva OBJEKT.
Pored klasa, postoje i drugi tipovi kao što su NABRAJANJA (engl. enumerations),
STRUKTURE i DELEGATI.
PONAŠANJE KLASE (objekta) se definiše METODAMA ČLANICAMA klase, dok se
SVOJSTVIMA određuje stanje klase.
C# sadrži veliki broj osnovnih - UGRAĐENIH tipova definisanih CLS platformom.
Objekti jednog tipa se mogu KONVERTOVATI u objekte drugog tipa (implicitno ili
eksplicitno).
PROMENLJIVE su skladišta za čuvanje VREDNOSTI određenog tipa.
Blokovi u C#
BLOKOVIMA koda se u C# definišu određene PROGRAMSKE CELINE kao što su
imenski prostor, klase, metode ili programski iskazi, a definišu se vitičastim
zagradama "{" i "}".
Rečnik c#-a se sastoji od ključnih reči (79+25), simbola i ogromnog broja TIPOVA.
using System;
namespace ConsoleApp4_NET_Framework
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Zdravo Svete");
System.Console.ReadKey();
}
}
}
Blok Ključne reči –
označene plavom
bojom
Blokovi
unutar
blokova
Promenljive u C# NAREDBE u C# predstavljaju celovitu programsku instrukciju i završavaju se slično
kao u C-u i Javi oznakom (;).
int x; // 1. naredba deklaracije (tip i ime promenljive)
x = 23; // 2. naredba dodeljivanja vrednosti promenljive
int y = x; // 3. naredba deklaracije i dodeljivanja
Konstante u C#:
x = 32; // zašto postoje dva oblika deklaracije?
const int FreezingPoint = 32; // Navedite razlike!
NABROJIVI TIPOVI (enum) predstavljaju grupu povezanih konstanti, primer:enum Temperature
{
Najniža_zabeležena_temperatura = 0,
Tačka_topljenja_leda = 32,
Prolećna_temeperatura = 60,
Letnja_temperatura = 72,
Tačka_ključanja_vode = 212,
};
Za koju temperaturnu skalu je dati primer?
Ime povezanih konstatnti
[F0]
T(°C) = (T(°F) - 32 °F)/1,8
Intellisense i nabrojivi tipovi u VS-u
Intellisense:
Pomoć VS-a pri pozivu već
deklarisanog nabrojivog tipa
podataka
Primer: konstante u C#
class Values
{
enum Temperatures
{
WickedCold = 0,
FreezingPoint = 32,
LightJacketWeather = 60,
SwimmingWeather = 72,
BoilingPoint = 212,
};
static void Main()
{
System.Console.WriteLine("Freezing point of water: {0}",(int) Temperatures.FreezingPoint);
System.Console.WriteLine("Boiling point of water: {0}", (int) Temperatures.BoilingPoint);
}
}
Simboličko ime konstanti
Temperatures enum tippromenljive
Farenhajtova skala, 1714. god.
JAVA: System.out.println("Hello World!");
Kada se želi prikaz konstante, mora se eksplicitno
konvertovati u int tip primenom CAST opratora.
Znakovni nizovi - Stringovi u C#
ZNAKOVNI NIZ predstavlja OBJEKT (pogledaj u Javi, kasnije nešto više o tome) koji se
sastoji od niza znakova i u programskim jezicima se naziva STRING.
Dekleracija STRINGA u C#-u je sledeća:
string myString;
Dekleracija i DODELJIVANJE vrednosti STRING-u u C#:
string myString = "Hello World";
STRINGOVI pojednostavljuju pisanje programa i za njih je u C#-u obezbeđen SKUP
METODA koje olakšavaju manipulaciju sa njima:
Concat(), Clone(), CompareTo(), Trim(), Split(), Join(), IndexOf(),
Insert(), Equals(), Remove(), Substring() ...
Rad sa METODAMA vezanim za string biće posebno obrađene i koristiće se u
vežbama.
Svojstvo i metode za stringove/ Objašnjenje/ član
Svojstvo i metode za stringove
/ Objašnjenje/ član
Primer1: metode za stringoveusing System;namespace String_primeri{
class Program{
static void Main(string[] args){
string myString = "This is a test string ";string myString1 = myString.Trim();string myString2 = myString1.Substring(0, 4);string myString3 = myString2.ToUpper();string myString4 = myString3.Replace("IS", "AT");
Console.WriteLine(myString + " - dužina stringa je " + myString.Length + " karaktera");Console.WriteLine(myString1 + " - dužina stringa je " + myString1.Length + " karaktera");
Console.WriteLine("Substring: " + myString2);Console.WriteLine("ToUpper: " + myString3);Console.WriteLine("Replace: " + myString4);
Console.ReadLine();
}}
}
Primer 2: metode za stringoveusing System;namespace String_primer2{
class Program{
static void Main(string[] args){
string myString = "Ovo je test string";char[] separator = { ' ' };string[] myWords;
myWords = myString.Split(separator);
foreach (string word in myWords){
Console.WriteLine("{0}", word);}
Console.ReadLine();}
}}
Objašnjenje foreachnaredbe u nastavku
Regularni izrazi
KLASA .NET-a koja pruža DODATNE MOGUĆNOSTI za manipulaciju stringovima se nalazi
u BIBLIOTECI KLASA u imenskom prostoru System.String.
MANIPULISANJE stringovima i PODUDARANJE uzoraka stringova se najčešće obavlja
REGULARNIM IZRAZIMA (engl. regular expression).
Mogu se RAVNOPRAVNO KORISTITI tipovi string i tipovi dobijeni KLASOM System.String (i
malo s i veliko početno slovo S).
ZAPAMTITE, jednom definisana vrednost promenljive string (ili String) je NEIZMENLJIVA,
što često OTEŽAVA RAD sa stringovima.
Za komforniji rad sa stringovima koristi se OBJEKTI klase StringBuilder koja omogućava
rad sa stringovima PROMENLJIVE DUŽINE.
STRINGOVI mogu da sadrže i ESCAPE SEKVENCE (o njima je bilo više reči u Javi, a
koriste se na ISTI način i u C#).
Regularni izrazi i stringovi
REGULARNI IZRAZI se primenjuju na znakovne nizove, a veoma često se znakovnim
nizom smatra ČITAV TEKSTUALNI DOKUMENT.
REGULARNI IZRAZI se sastoje od DVE vrste znakova:
LITERALA (znak ili sekvenca znakova koji se traže) i
METAZNAKOVA (služi kao komanda za rasčlanjivanje):
^ $ . | { } [ ] ( ) * + ? \.
Primer regularnog izraza je dat u nastavku, a za njegovo tumačenje se koristi
mehanizam koji se naziva rasčlanjivač.
^(From|To|Subject|Date):
Ovaj izraz odgovara svakom podskupu sa rečima “From”, “To”, “Subject”, “Date” ako
su na početku novog reda (^), a završavaju se dvotačkom (:).
Za ove potrebe razvijena je SINTAKSA REGULARNIH IZRAZA, u IMENSKOM PROSTORU
System.Text.RegularExpressions klasom Regex.
Metode Regex klase
Metode klase Regex omogućavaju
izvršenje sledeći operacija:
Utvrđivanje da li se regularni
obrazac izraza pojavljuje u ulaznom
tekstu pozivanjem metode
Regex.IsMatch.
Utvrđuje jednu ili sve pojave teksta
koji odgovaraju obrascu regularnog
izraza pozivanjem Regex.Match ili
Regex.Matches metode.
Zamena teksta koji odgovara
obrascu regularnog izraza
pozivanjem metode Regex.Replace.
Primer 1: regularni izrazising System;
using System.Text.RegularExpressions;
using System.Text;
namespace Regularni_izrazi
{
class Program
{
static void Main(string[] args)
{
string pattern = @"\b\d+(,\d{3})*\.\d{2}\b";
string input = "16.32\n194.03\n1,903,672.08";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine(match.Result("$$ $&"));
Console.ReadLine();
}
}
}
Dodaj simbol $ i razmak ispred
svakog broja koji sadrži dve cifre
iza decimalne tačke.
Primer 2: regularni izrazi (1)
using System;
using System.Text.RegularExpressions;
using System.Text;
namespace Regularni_izrazi
{
class Program
{
static void Main(string[] args)
{
string pattern = @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$";
string[] emailAddresses = {"[email protected]", "[email protected]",
"[email protected]", "[email protected]",
"[email protected]", "js#[email protected]",
"j_9@[129.126.118.1]", "[email protected]",
"js*@proseware.com", "[email protected]",
"[email protected]", "[email protected]",
"\"j\\\"s\\\"\"@proseware.com", "js@contoso.中国" ,
};
Ispitivanje validnosti
e - mail adrese.
Primer 2: regularni izrazi (2)
foreach (var emailAddress in emailAddresses)
{
if (Regex.IsMatch(emailAddress, pattern))
Console.WriteLine($"Valid: {emailAddress}");
else
Console.WriteLine($"Invalid: {emailAddress}");
}
Console.ReadKey();
}
}
}
Struktura uzorka@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$";
Uzorak ^
Uzorak (?(")
Uzorak (?(")(".+?(?<!\\)"@)
Uzorak |(([0-9a-z]
Uzorak (\.(?!\.))
Uzorak |[-!#\$%&'\*\+/=\?\^`\{\}\|~\w]
Uzorak ((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*
Uzorak @
Uzorak (?<=[0-9a-z])
Uzorak (?(\[)
Uzorak (\[(\d{1,3}\.){3}\d{1,3}\])
Uzorak |(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+
Uzorak [a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))
Uzorak $
Karakteri regularnih izraza
Regularni izrazi, primeri
Visoka tehnička škola Niš
Upravljanje programskim tokom u C#
Programski tokovi/skokovi
LINEARNI TOK izvršavanja programskog koda može se menjati NAREDBAMA za
PROGRAMSKE SKOKOVE.
U C# postoje DVE VRSTE programskih skokova:
Uslovni i
Bezuslovni.
Pored programskih skokova, na tok programa utiču i naredbe tipa PROGRAMSKIH
PETLJI i ITERACIJE.
BEZUSLOVNI programski skok se može implementirati na dva načina:
Pozivanjem METODE na izvršenje;
Pomoću REZERVISANIH REČI za bezuslovni programski skok: goto, break, continue, return i
throw (o njoj više kasnije).
USLOVNI programski skokovi se implementiraju rezervisanim rečima:
if , else, switch.
Vizualizacija kontrolnih naredbi (1)
[t]-true-istina
[f]-false-laž
Poziv metode – bezuslovni skok
using System;
class Functions
{
static void Main( )
{
Console.WriteLine("In Main! Calling SomeMethod( )...");
SomeMethod( );
Console.WriteLine("Back in Main( ).");
}
static void SomeMethod( )
{
Console.WriteLine("Greetings from SomeMethod!");
}
}
Izlaz:
In Main! Calling SomeMethod( )...
Greetings from SomeMethod!
Back in Main( ).
Pozivanjemetoda,
kojih?
Definisanje metode
O’REILLY
ALIAS
Naredba uslovnog skoka: if-else
if (izraz )
naredba 1;
[else
naredba2; ]
....................
if ( vrednostJedan > vrednostDva )
Console.WriteLine( "VrednostJedan: {0} veća nego vrednostDva: {1}",
vrednostJedan, vrednostDva);
else
Console.WriteLine( " vrednostDva : {0} veća od vrednostJedan: {1}",
valueTwo,valueOne);
....................O’REILLY
Opciono !
Obavezno !
Samo po jedan programski iskaz!
Šta ako ima potrebe za VIŠE
programskih iskaza – BLOK!
Blok naredbi
O’REILLY
if(neki_uslov)
{
Naredba_Jedan;
Naredba_Dva;
Naredba_Tri;
}
else
{
Naredba_Četiri;
Naredba_Pet;
Naredba_Šest;
Naredba_Šedam;
}
... nastavak ...
uslov
ispunjen ?
da
ne
... nastavak ...
...
PRVI BLOK
naredbi je oivičen
vitičastim
zagradama!
DRUGI BLOK
naredbi je oivičen
vitičastim
zagradama!
da
ne DRUGI
blok
naredbi
PRVI
blok
naredbi
Ugnežđene if-else naredbe
O’REILLY
using System;
class Values
{
static void Main( )
{
int temp = 32;
if (temp <= 32)
{
Console.WriteLine("Warning! Ice on road!");
if (temp == 32)
{
Console.WriteLine( "Temp exactly freezing, beware of water.");
}
else
{
Console.WriteLine("Watch for black ice! Temp: {0}", temp);
}
} // <=32 } // main } // class
Šta treba prepraviti u kodu da
bi se koristila Celziusova skala?
Switch naredba (1)
Često se ugnežđene if naredbe TEŠKO ČITAJU, naročito ako ima više nivoa
ugnežđavanja.
Zbog toga se koristi naredba SWITCH kako bi se čitanje programa učinilo preglednijim.
Opšti oblik switch naredbe:
switch (neki_izraz)
{
case konstantan-izraz:
naredba;
naredba skoka
[default: naredba ]
}
Evo jednog “političkog” primera iz USA!
Switch naredba (2)
using System;
class Values
{
static void Main( )
{
const int Democrat = 0;
const int LiberalRepublican = 1;
const int Republican = 2;
const int Libertarian = 3;
const int NewLeft = 4;
const int Progressive = 5;
int myChoice = Libertarian;
switch (myChoice)
{
case Democrat:
Console.WriteLine("You voted Democratic.\n");
break;
case LiberalRepublican: // fall through
//Console.WriteLine("Liberal Republicans vote Republican\n");
Ispitivana vrednost nema
zaseban skup naredbi
Switch naredba (3)
case Republican:
Console.WriteLine("You voted Republican.\n");
break;
case NewLeft:
Console.WriteLine("NewLeft is now Progressive");
goto case Progressive;
case Progressive:
Console.WriteLine("You voted Progressive.\n");
break;
case Libertarian:
Console.WriteLine("Libertarians are voting Republican");
goto case Republican;
default:
Console.WriteLine("You did not pick a valid choice.\n");
break;
}
Console.WriteLine("Thank you for voting.");
}
}Zastarela goto naredba!?
Labela (oznaka)O’REILLY
Regularni izrazi, primena
Naredba ponavljanja: while Kada se unapred NE ZNA broj prolazaka kroz petlju koristi se naredba while.
Opšti oblik ove naredbe je: while (izraz) prog_iskaz;
using System;
public class Tester
{
public static int Main( )
{
int i = 0;
while (i < 10)
{
Console.WriteLine("i: {0}",i);
i++;
}
return 0;
}
}
O’REILLY
using System;
public class Tester
{
public static int Main( )
{
int i = 11;
do
{
Console.WriteLine("i: {0}",i);
i++;
} while (i < 10);
return 0;
}
}
Naredba ponavljanja: do...while
O’REILLY
Koliko puta će se izvršiti ovaj
blok naredbi?
Koje su osnovne razlika
između while i do while
naredbe?
using System;
public class Tester
{
public static int Main( )
{
for (int i=0; i<100; i++)
{
Console.Write("{0}", i);
if (i%10 == 0)
{
Console.WriteLine("\t{0}", i);
}
}
return 0;
}
}
Naredba ponavljanja: for
O’REILLY
Izlaz:
0 0
1 2 3 4 5 6 7 8 9 10 10
11 12 13 14 15 16 17 18 19 20 20
21 22 23 24 25 26 27 28 29 30 30
31 32 33 34 35 36 37 38 39 40 40
41 42 43 44 45 46 47 48 49 50 50
51 52 53 54 55 56 57 58 59 60 60
61 62 63 64 65 66 67 68 69 70 70
71 72 73 74 75 76 77 78 79 80 80
81 82 83 84 85 86 87 88 89 90 90
91 92 93 94 95 96 97 98 99
/*Primer za ilustraciju foreach petlje*/
class PrimerForEach
{
public static void Main()
{
int [] myValues = {2, 4, 3, 5, 1};
foreach (int counter in myValues)
{
System.Console.WriteLine("counter = " + counter);
}
}
}
Naredba ponavljanja: foreach
O’REILLY
Izlaz:
Counter = 2
Counter = 4
Counter = 3
Counter = 5
Counter = 1
NOVO:
foreach - naredba
omogućava iterativni
pristup svakom elementu
niza!
Deklaracija i
inicijalizacija niza
Štampanje svih članova
niza myValues foreach
naredbom
Deklaracija INTERNE promenljive
counter koja uzima vrednosti iz
int niza myValues
class PrimerBraek
{
public static void Main()
{
int total = 0;
for (int counter = 1; counter <= 10; counter++)
{
System.Console.WriteLine("counter = " + counter);
total += counter;
if (counter == 5)
{
System.Console.WriteLine("break from loop");
break;
}
}
System.Console.WriteLine("total = " + total);
}
}
Prekidanje petlje: break
O’REILLY
Izlaz:
Counter = 1
Counter = 2
Counter = 3
Counter = 4
Counter = 5
break from loop
total =15
Trajno prekida
programsku if naredbu i
for petlju. Kontrola se
prenosi na prvu naredbu
izvan for pelje
class PrimerContinue
{
public static void Main()
{
int total = 0;
for (int counter = 1; counter <= 10; counter++)
{
if (counter == 6)
{
System.Console.WriteLine(“Continue from loop start");
continue;
}
System.Console.WriteLine("Counter = " + counter);
total += counter;
}
System.Console.WriteLine("total = " + total);
}
}
Preskakanje ostatka petlje: continue
O’REILLY
PRESKAČE preostali kod u telu petlje i vraća prog.
kontrolu na početakpetlje.
Izlaz:
Counter = 1
Counter = 2
Counter = 3
Counter = 4
Counter = 5
Continue from loop
start
Counter = 7
Counter = 8
Counter = 9
Counter = 10
Counter = 49
Operatori C#-a Operatori su simboli koji dovode do neke akcije!
Jednostavni ARITMETIČKI operatori su +, -, *, /.
Operator moduo (%) daje ostatak deljenja 17 % 4 = 1!
Operatori PREČICE – Objedinjeni operatori
mojaZarada += 5000; // mojaZarada = mojaZarada + 5000
mojaZarada *= 5000; // mojaZarada = mojaZarada * 5000
mojaZarada -= 5000; // mojaZarada = mojaZarada - 5000
Operatori INKREMENTIRANJA/DEKREMENETIRANJA:
prvaVrednost = drugaVrednost++; // sufix
prvaVrednost = ++drugaVrednost; // prefixO’REILLY
-- Operatori ++using System;
class Values
{
static void Main( )
{
int vrednostPrva = 10;
int vrednostDruga;
vrednostDruga = vrednostPrva++;
Console.WriteLine("Posle postfix-a: {0}, {1}", vrednostPrva, vrednostDruga);
vrednostPrva = 20;
vrednostDruga = ++vrednostPrva;
Console.WriteLine("Posle prefix-a: {0}, {1}", vrednostPrva, vrednostDruga);
}
}O’REILLY
Izlaz:
Posle postfix-a: 11, 10
Posle prefix-a: 21, 21
Prvo se izvrši dodeljivanje,
a zatim inkrementiranje!
Prvo se izvrši inkrementiranje,
a zatim dodeljivanje!
Relacioni operatori
O’REILLY
Ime Operator Primer
Jednako == Vrednost == 100
Nije jednako != Vrednost != 100
Veće od > Vrednost > 100
Veće od ili jednako >= Vrednost >= 100
Manje od < Vrednost < 100
Manje od ili jednako <= Vrednost <= 100
Relacioni operatori
O’REILLY
Ako je x=5 i y=7, onda su vrednosti izraza dati u tabeli:
Ime Operator Primer Vr. izraza
I && (x==3) && (y==7) False
Ili || (x==3) || (y==7) True
Ne ! ! (x==3) True
Ternarni operator ? : (1)
Ternarni operator je operator sa tri operanda (?:).
Ovaj operator računa uslovni_izraz, a zatim izvršava izraz_1 ili izraz_2 u zavisnosti
od vrednosti uslovnog izraza.
uslovni_izraz ? izraz_1 : izraz_2
Ako je ovo tačno, uradi (izračunaj vrednost) izraz_1, u suprotnom uradi izraz_2.
Pogledajte sledeći primer:
Ternarni operator ? : (1)
using System;
class Values
{
static void Main( )
{
int vrednostPrva = 10;
int vrednostDruga = 20;
int maxVr = vrednostPrva > vrednostDruga ? VrednostPrva : vrednostDruga;
Console.WriteLine(“vrednostPrva: {0}, vrednostDruga: {1}, maxVr.: {2}",
vrednostPrva, vrednostDruga, maxVr.);
}
}
MaxVr = 10 > 20 ? 10 : 20
Izlaz:
vrednostPrva: 10, vrednostDruga: 20, maxVr.: 20
Operator “is”
Operatorom is se proverava da li je promenljiva ODGOVARAJUĆEG TIPA!
Class Primer_is
{
public static void Main()
{
int myInt = 0;
bool compatible = myInt is int;
System.Console.WriteLine("myInt is int = " + compatible);
compatible = myInt is long;
System.Console.WriteLine("myInt is long = " + compatible);
compatible = myInt is float;
System.Console.WriteLine("myInt is float = " + compatible);
}
}
Izlaz:
myInt is int = True
myInt is long = False
myInt is float = False
Pretprocesorske direktive (1)
Pre procesa kompajliranja u C# se prvo pokreće PRETPROCESOR.
PRETPROCESOR priprema program za prosleđivanje kompajleru.
Programer zadaje instrukcije pretprocesoru putem DIREKTIVA koje postavljaju u
zaseban programski red koji počinje sa #.
Najčešće se koriste u procesu DEBAGOVANJA.
PRETPROCESORSKE DIREKTIVE se stavljaju u izvorni kod, a ispred nih se postavlja
znak #.
U primeni su sledeće direktive:
#if, #else, #elif, #endif, #define, #undef, #warning, #error, #line,
#region, #endregion, #pragma, #pragmawarning, #pragma checksum
Direktive se odnose se na IDE i prikazivanje dela koda (oivičenog ovim
direktivama) aplikacije koji je generisao sam IDE.
#region/endregion
Pretprocesorske direktive (2)#define DEBUG
class Example4_16
{
public static void Main()
{
int total = 0; int counter = 0;
myLabel:
counter++; total += counter;
System.Console.WriteLine("counter = " + counter);
if (counter < 5)
{
#if DEBUG
System.Console.WriteLine("goto myLabel");
#endif
goto myLabel;
}
System.Console.WriteLine("total = " + total);
}
}
#define definiše preprocesorski simbol
DEBUG, završetak direktive bez (;)
Provera postojanja definicije
simbola DEBUG. Kompajler
prevodi ovaj deo koda.
Preprocesorska direktiva
#undef DEBUG
poništava definiciju
simbola