W tym rozdziale omówimy przykłady, kiedy w ramach jednego programu można legalnie stosować zmienne o takiej samej nazwie. Przeanalizuj poniższy kod 1.
#property strict
void OnStart()
{
//...
//--- 1. granica obszaru lokalnego 'for', początek
for(int i = 0; i < 100; i++)
{
//...
}
//--- 1. granica obszaru lokalnego 'for', koniec
//--- 2. granica obszaru lokalnego 'for', początek
for(int i = 0; i < 100; i++)
{
//...
}
//--- 2. granica obszaru lokalnego 'for', koniec
//...
}
Co tu widzimy? W obszarze głównej funkcji skryptu OnStart() za pomocą operatora pętli for utworzono 2 obszary lokalne: granice 1-ego są zaznaczone na zielono, a 2-ego na czerwono. W obu przypadkach w nagłówku for inicjalizowana jest zmienna o nazwie i (int i = 0). W tym kodzie dla kompilatora wszystko będzie grało, nie będzie ani błędu ani ostrzeżenia.
W odróżnieniu od przykładu opisanego w poprzednim rozdziale tutaj te 2 obszary nie pokrywają się. Żaden z nich nie został zapisany wewnątrz drugiego. Wiemy już, że czas życia zmiennej jest ograniczony czasem życia obszaru, gdzie została ona utworzona. Dlatego, kiedy program kończy pracę w obszarze 1-ego operatora for, zmienna i zostaje usunięta z pamięci RAM. Kiedy program dochodzi do 2-ego for to na potrzeby tej pętli w RAM tworzy się nowa zmienna i. Nie ma tu żadnej kolizji, ponieważ w tym momencie w pamięci programu nie istnieje inna zmienna o tej samej nazwie.
Jeszcze jeden przykład (kod 2).
#property strict
void OnStart()
{
bool LocalFlag = false;
if(LocalFlag == true)
{
int LocalVariable = 7;
Print("LocalVariable = ", LocalVariable);
}
else
{
int LocalVariable = 55;
Print("LocalVariable = ", LocalVariable);
}
}
W tym przypadku, dwa obszary lokalne utworzone przez if i else znajdują się jeden po drugim i nie pokrywają się. W związku z tym w każdym z nich można bezpiecznie tworzyć identyczne zmienne.