Eljárások definiciójának sorrendje
Az alprogramokat mindig valamely osztály belsejében kell definiálni. Egyetlen osztály több alprogramot is tartalmazhat.
Egyes programnyelveken az alprogramok definiálási sorrendjére megkötések vannak. A C# nyelven azonban az alprogramokat az osztály belsejében tetszőleges sorrendben definiálhatjuk, erre semmiféle megkötés nincs.
A MAIN mint eljárás
A program futása során alprogramokat kell végrehajtania. Van egy kitüntetett alprogram, amelynek a neve speciális, kötött. Ez az alprogram definiálja a program kezdőpontját. Az első utasításának végrehajtásával kezdődik a program futása, és amennyiben ezen alprogram utolsó utasítását is végrehajtottuk, úgy a program futása befejeződik.
A C#-ban ezen alprogram a Main() nevű alprogram. Minden C# programnak tartalmaznia kell egy ilyen Main() nevű alprogramot, de az lényegtelen, hogy ezen Main() melyik névtér melyik osztályába kerül. A fordítás és kódgenerálás végén az .exe file-ba a megfelelő helyre be fogja írni, hogy hol is van pontosan ez a Main() függvény, így a program indulásakor azonnal a Main() első utasítására fog kerülni a vezérlés.
A Main() alakja:
public static void Main()
{
// itt kezdődik a program
// …
// és itt is ér véget.
}
Eljárások saját változóinak hatásköre
Amennyiben egy alprogram változót deklarál az utasítástörzsében, annak hatásköre az őt befoglaló blokk végéig tart, ez legfeljebb az alprogram utasítástörzsének vége lehet.
public static void Akarmi()
{
int x = 10;
…
}
Ezen x változó hatásköre az eljárás utasítástörzsét bezáró blokkjellel (}) ér véget. A változóra a hatáskörén kívül hivatkozni nem lehet, így hibás az alábbi kód:
public static void MasikAkarmi()
{
Console.WriteLine(”X={0}”,x);
}
A hatáskör zártsága miatt semelyik alprogram nem hivatkozhat a másik alprogram valamely változójára. A változók minden alprogram saját, egyedi változói (lokális, helyhez kötött változók).
Eljárások saját változóinak élettartama
Amennyiben egy alprogram változót deklarál az utasítástörzsében, annak hatásköre az őt befoglaló blokk végéig tart, ez legfeljebb az alprogram utasítástörzsének vége lehet.
public static void Akarmi()
{
int x = 10;
…
}
Ezen x változó élettartama dinamikus. Ez azt jelenti, hogy a program indulása pillanatában még nincs benn a memóriában, és az alprogram lefutása után sem marad benne.
Az alprogram változói csak akkor kerülnek be a memóriába, amikor az alprogram elindul. Az alprogram törzsében lévő utasítások hivatkoznak ezekre a változókra, használják őket. Amikor azonban az alprogram futása befejeződik, elérjük az utasítástörzs végét, a visszatérés után az alprogram minden változója a memóriából automatikusan eltűnik (felszabadul).
Vagyis az alprogramon belül deklarált változók csak addig élnek, amíg az alprogram fut. Sem előtte, sem utána nem foglalják a memóriát.
Az alprogram utasítástörzse tartalmazhat egy speciális utasítást, a return-t. A return szerepe hasonló, mint a ciklusok belsejében szereplő break. A return hatására az alprogram futása azonnal befejeződik, véget ér, mintha csak elértük volna az utasítástörzs végét.
Pl.:
static void Kiiras2( int[] v)
{
if ( v == null) return;
if ( v.Length == 0) return;
foreach( int x in v) Console.WriteLine( x );
}
Amennyiben az alprogram függvény, akkor a visszatérési értéket a return után kell írni kifejezés formájában. A függvények futása kötelezően return kifejezés utasítással kell véget érjen.
Pl.:
static int AbszolutErtek( int a)
{
if (a>=0) return a;
else return –a;
}
vagy ….
static int Osszead( int a, int b)
{
return a+b;
}
vagy …
static int Nagyobbik( int a, int b )
{
if (a>b) return a;
return b;
}
A nem függvény alprogramoknak (eljárásoknak) nem kötelező, hogy return-t tartalmazzanak, hiszen nekik nincs kötelezően beállítandó visszatérési értékük. De az eljárások is tartalmazhatnak return-t, melynek hatására befejezik működésüket.
Több eljárás között megosztható változók deklarálása
Az alprogram belsejében deklarált változók az adott alprogram saját változói, a bennük elhelyezett értékhez más alprogramok nem képesek hozzáférni, mivel kívül esnek a változók hatáskörén.
Van lehetőség olyan változók létrehozására, amely azonban megosztott, közös az alprogramok között. Az ezekben a változókban elhelyezett értékekhez minden alprogram hozzáférhet.
Ezen változókat (valójában osztályszintű mezők) az alprogamokon kívül, magában az alprogramokat is tartalmazó osztályban kell deklarálni, és az alprogramokhoz hasonlóan static jelzővel kell ellátni őket:
Pl.:
class Példák_06
{
static int osszeg;
static void OsszegSzamitasa( int[] v )
{
osszeg = 0; // a közös változó
foreach( int x in v)
osszeg = osszeg + x;
}
public static void Main()
{
int[] t = new int[6] { 4, 8, 3, 7, 8, 3 }; // ’t’ feltöltése elemekkel
OsszegSzamitasa ( t ); Console.WriteLine(”Az elemek osszege={0}”, osszeg );
}
}
Az alprogram belsejében deklarált változók az adott alprogram saját változói, a bele elhelyezett értékhez más alprogramok nem képesek hozzáférni, mivel kívül esnek a változók hatáskörén.
Az alprogramok közötti változókat alprogramokon kívül, magában az alprogramokat is tartalmazó osztályban kell deklarálni, és az alprogramokhoz hasonlóan static jelzővel kell ellátni őket:
class Sajat
{
static int osszeg;
…
}
Ezen változók hatásköre a teljes osztályra kiterjed, így az adott osztályon belül definiált alprogramok mindegyikében elérhetőek és használhatóak. Ugyanakkor a befoglaló blokk szabály miatt más osztályokban definiált (külső) alprogramok már nem használhatják.
Van lehetőség a változó hatáskörének kiterjesztésére, a public kulcsszóval:
class Sajat
{
public static int osszeg;
…
}
A public static változókat más osztályokban is el lehet érni, csak a tartalmazó osztály nevét is ki kell írni, pl: Sajat.osszeg = 0;
Az alprogram belsejében deklarált változó az adott alprogram saját változója, a bele elhelyezett értékhez más alprogramok nem képesek hozzáférni, mivel kívül esnek a változó hatáskörén.
Az alprogramok közötti változókat alprogramokon kívül, magában az alprogramokat is tartalmazó osztályban kell deklarálni, és az alprogramokhoz hasonlóan static jelzővel kell ellátni őket:
class Sajat
{
static int osszeg;
…
}
Ezen változókat több alprogramban is el lehet érni. Ezért élettartamuk nem köthető semelyik alprogram futási idejéhez.
Ezen közös változók élettartama statikus (erre utal a static kulcsszó is). Ez azt jelenti, hogy az ilyen változók a program indulásának pillanatában kerülnek be a memóriába, és a program futásának teljes időtartama alatt végig ott is maradnak. Csak akkor szabadul fel az általuk lekötött memória, amikor maga a program futása is befejeződik.
Ez nem túl takarékos memóriaterület-gazdálkodás, ezért az ilyen változók mennyiségét szorítsuk a minimálisra.