DODATAK: Definisanje podataka na nivou bloka
Do sada smo videli da se C# program sastoji od različitih delova: klasa, metoda i naredbi.
Sada treba da naučimo gde možemo da definišemo promenljivu i gde tu promenljivu možemo da koristimo.
1. Šta je blok?
U C# jeziku blok je deo programa koji je omeđen vitičastim zagradama:
{
// naredbe
}
Na primer, telo metode Main() predstavlja jedan blok:
static void Main()
{
Console.WriteLine("Zdravo!");
}
Sve između:
{
i
}
pripada tom bloku.
2. Promenljiva definisana u bloku
Promenljivu možemo definisati unutar bloka:
static void Main()
{
int godine = 17;
Console.WriteLine(godine);
}
Promenljiva godine je definisana unutar bloka metode Main().
Ona se može koristiti u tom bloku.
static void Main()
{
int godine = 17;
Console.WriteLine(godine);
Console.WriteLine(godine + 1);
}
Rezultat:
17
18
3. Šta znači „nivo bloka“?
Kada kažemo da je podatak definisan na nivou bloka, to znači da je promenljiva definisana unutar određenog bloka i da je njena oblast važenja (scope) vezana za taj blok.
Na primer:
static void Main()
{
int broj = 10;
Console.WriteLine(broj);
}
Promenljiva broj postoji u okviru ovog bloka.
Možemo je koristiti:
Console.WriteLine(broj);
ali samo dok se nalazimo u odgovarajućem bloku.
4. Primer sa unutrašnjim blokom
Pogledajmo malo složeniji primer:
static void Main()
{
int broj = 10;
{
int rezultat = broj * 2;
Console.WriteLine(rezultat);
}
}
Ovde imamo dva bloka.
Spoljašnji:
{
int broj = 10;
{
int rezultat = broj * 2;
Console.WriteLine(rezultat);
}
}
i unutrašnji:
{
int rezultat = broj * 2;
Console.WriteLine(rezultat);
}
Promenljiva broj je definisana u spoljašnjem bloku, pa joj možemo pristupiti i iz unutrašnjeg bloka.
Promenljiva rezultat je definisana u unutrašnjem bloku.
Zato je možemo koristiti unutar tog bloka.
5. Zapamtiti:
Promenljiva definisana u nekom bloku može se koristiti u tom bloku i njegovim unutrašnjim blokovima, ali ne i izvan tog bloka.
Primer:
static void Main()
{
int broj = 10;
{
int rezultat = broj * 2;
Console.WriteLine(rezultat);
}
Console.WriteLine(broj);
}
Ovo je ispravno.
broj možemo koristiti i unutar unutrašnjeg bloka i nakon njega, jer je definisan u spoljašnjem bloku.
Ali:
static void Main()
{
{
int rezultat = 20;
Console.WriteLine(rezultat);
}
Console.WriteLine(rezultat); // GREŠKA
}
Ovo nije ispravno.
Zašto?
Zato što je rezultat definisan u unutrašnjem bloku i izvan tog bloka više nije dostupan.
6. Veza sa metodama
Ovo je posebno važno kada radimo sa metodama.
Na primer:
static void Main()
{
int broj = 10;
Console.WriteLine(broj);
}
Promenljiva broj pripada bloku metode Main().
Ako imamo drugu metodu:
static void Main()
{
int broj = 10;
Console.WriteLine(broj);
}
static void Test()
{
Console.WriteLine(broj); // GREŠKA
}
Test() ne može direktno da koristi promenljivu broj.
Zašto?
Zato što je broj definisan unutar bloka metode Main().
Možemo reći:
Main()
└── broj
Test()
└── ne vidi promenljivu broj
7. Primer sa if naredbom
Blokovi se ne pojavljuju samo kod metoda.
Na primer, if naredba takođe može imati svoj blok:
int broj = 10;
if (broj > 5)
{
string poruka = "Broj je veći od 5";
Console.WriteLine(poruka);
}
Promenljiva poruka postoji samo u okviru if bloka.
Zato ovo nije ispravno:
int broj = 10;
if (broj > 5)
{
string poruka = "Broj je veći od 5";
}
Console.WriteLine(poruka); // GREŠKA
8. Zašto je ovo korisno?
Definisanje podataka na nivou bloka omogućava da promenljive koristimo samo tamo gde su nam potrebne.
Na taj način:
-
program je pregledniji;
-
smanjuje se mogućnost grešaka;
-
različiti delovi programa mogu imati svoje promenljive;
-
lakše je održavati program.
Zamislite da imamo veliki program sa mnogo promenljivih. Ne želimo da svaka promenljiva bude dostupna u svakom delu programa.
Zato koristimo oblast važenja promenljive (scope).
9. Primer koji povezuje sve ovo
using System;
class Program
{
static void Main()
{
Console.Write("Unesite broj: ");
double broj = double.Parse(Console.ReadLine());
double koren = Math.Sqrt(broj);
Console.WriteLine("Kvadratni koren je: " + koren);
}
}
Promenljive broj i koren definisane su unutar bloka metode Main().
Zato ih možemo koristiti u tom bloku.
10. Još jedan primer
using System;
class Program
{
static void Main()
{
int broj = 10;
if (broj > 0)
{
int rezultat = broj * 2;
Console.WriteLine(rezultat);
}
Console.WriteLine(broj);
}
}
Ovde imamo:
Main blok
│
├── broj
│
└── if blok
│
└── rezultat
broj možemo koristiti u oba bloka.
rezultat možemo koristiti samo u if bloku.
11. Pravilo za pamćenje
Što je promenljiva definisana „unutra“, dostupna je tom bloku i njegovim unutrašnjim blokovima. Kada izađemo iz tog bloka, promenljiva više nije dostupna.
Možemo zamisliti kutije:
+---------------------------+
| Spoljašnji blok |
| |
| broj |
| |
| +---------------------+ |
| | Unutrašnji blok | |
| | | |
| | rezultat | |
| +---------------------+ |
| |
+---------------------------+
Unutrašnji blok može da koristi ono što se nalazi u spoljašnjem bloku.
Ali spoljašnji blok ne može da koristi promenljivu koja postoji samo u unutrašnjem bloku.
12. Mini-zadatak
Šta će se desiti kada se izvrši sledeći program?
static void Main()
{
int a = 5;
{
int b = 10;
Console.WriteLine(a);
Console.WriteLine(b);
}
Console.WriteLine(a);
}
Odgovor:
5
10
5
Zašto?
-
aje definisana u spoljašnjem bloku i dostupna je i unutrašnjem bloku. -
bje definisana u unutrašnjem bloku i dostupna je samo tamo.
13. Zadatak za samostalan rad
Napisati program koji:
-
učitava broj;
-
ako je broj pozitivan, definiše promenljivu
kvadrat; -
izračunava kvadrat broja;
-
ispisuje rezultat.
Početak programa:
int broj = int.Parse(Console.ReadLine());
if (broj > 0)
{
// ovde definisati promenljivu kvadrat
}
Pitanje za razmišljanje
Da li promenljivu kvadrat možemo koristiti ovde?
if (broj > 0)
{
int kvadrat = broj * broj;
}
Console.WriteLine(kvadrat);
Ne.
Promenljiva kvadrat definisana je u if bloku i izvan njega više nije dostupna.
Zaključak
Kod definisanja podataka važno je da znamo gde je promenljiva definisana i gde može da se koristi.
To nazivamo oblašću važenja promenljive (scope).
Osnovno pravilo je:
Promenljiva definisana u bloku
↓
dostupna u tom bloku
↓
dostupna u unutrašnjim blokovima
↓
nije dostupna izvan tog bloka
Ovo pravilo će nam biti veoma važno kada budemo radili sa metodama, if naredbama, petljama i klasama.