A legalapvetÅ‘bb feltételes elágazásos vezérlési szerkezet. Amennyiben a paraméterként megadott kifejezés igaz, akkor a megadott utasÃtások végrehajtódnak. Megadási formátuma a következÅ‘:
if (feltétel)
{
utasÃtás1;
utasÃtás2;
}
Amennyiben csak egyetlenegy utasÃtást szeretnénk végrehajtatni, akkor nem kötelezÅ‘ a blokk zárójelek megadása:
if (feltétel) utasÃtás;
Az if szerkezet kibÅ‘vÃthetÅ‘ egy else ággal. Az else ágba a vezérlés akkor fog kerülni, ha az if feltétele hamis. Megadási formája:
if (feltétel) utasÃtás; //feltétel igaz volt
else utasÃtás; //a feltétel hamis volt
Több if utasÃtás is egymásba ágyazható else ágak segÃtségéhez. Ezt hÃvjuk else if szerkezetnek:
if (feltétel) utasÃtás;
else if (másik_feltétel) utasÃtás;
else utasÃtás;
Ezen szerkezetben, ha az elsÅ‘ feltétel igaz volt, akkor a hozzárendelt utasÃtások fognak végrehajtódni. Ha az elsÅ‘ feltétel nem volt igaz, akkor megnézi a második feltételt. Ha az igaz volt, akkor a hozzá társÃtott utasÃtásokkal folytatódik a program végrehajtása. Ha egyik feltétel sem volt igaz, akkor az utolsó else ág utasÃtásai futnak le.
Természetesen egy if ágon belül több feltételt is kombinálhatunk. A különböző feltételek definiálásánál ügyeljünk arra, hogy a különálló feltételeket zárójelezzük összekapcsolás előtt. Összekapcsolásra a logikai operátorok használhatóak.
If-else szerkezet használatára mintaprogram:
using System;
namespace PeldaIf
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Kérem adjon meg egy számot!");
var bevitel = Console.ReadLine();
int x = Convert.ToInt32(bevitel);
if (x >= 20) Console.WriteLine("Nagyobb, vagy egyenlő , mint 20");
else if (x >= 10) Console.WriteLine("Nagyobb, vagy egyenlő, mint 10");
else Console.WriteLine("Kisebb, mint 10");
//Komplex feltétel, zárójelezés fontos!
if (((x % 2) == 0) && (x > 0))
{
Console.WriteLine("A megadott szám páros és nem nulla");
}
else Console.WriteLine("Páratlan vagy nulla");
Console.ReadKey();
}
}
}
A program kimenete valami hasonló lesz:
Kérem adjon meg egy számot!
20
Nagyobb, vagy egyenlo, mint 20
A megadott szám páros és nem nulla
&&, || és a & , | közötti különbségek
A kifejezések kiértékelése esetén az if-en belül csak olyan kifejezések állhatnak, amelyek valamilyen formában bool (logikai) tÃpust adnak vissza, eltérÅ‘en a C/C++ nyelvektÅ‘l, ahol az alábbi kódrészlet is működik:
int valtozo = 1;
if (valtozo) {
/*utasÃtások*/
}
C# estén viszont a fenti kódrészlet fordÃtási hibát eredményez. Az alábbiak szerint kell módosÃtani a kódot:
int valtozo = 1;
if (valtozo == 1)
{
//utasÃtások
}
Ezért mondhatni kézenfekvÅ‘ a logikai operátorok használata. Viszont nem kapunk fordÃtási hibát, ha a && jel helyett csak egy & jelet teszünk. UgyanÃgy akkor sem kapunk hibát, ha a || jelet kicseréljük egy | jelre.
Azonban két különbözÅ‘ tÃpusú viselkedést tapasztalunk. A duplázott jelek úgynevezett rövidre zárt (short circuited) operátorok. Ez azt jelenti, hogy a kifejezés kiértékelés szempontjából optimalizáltak. Ennek bemutatására nézzük meg az alábbi kódot:
using System;
namespace PeldaIfShortcircuit
{
class Program
{
static bool Teszt1()
{
Console.WriteLine("Teszt1 kiértékelése...");
return false;
}
static bool Teszt2()
{
Console.WriteLine("Teszt2 kiértékelése...");
return true;
}
static void Main(string[] args)
{
if (Teszt1() & Teszt2())
{
//Mindkét metódus lefut a tesztelés közben
}
Console.WriteLine();
if (Teszt2() | Teszt1())
{
//Mindkét metódus lefut a tesztelés közben
}
Console.WriteLine();
if (Teszt1() && Teszt2())
{
//Teszt2 nem hÃvódik meg
}
Console.WriteLine();
if (Teszt2() || Teszt1())
{
//Teszt1 nem hÃvódik meg
}
Console.ReadLine();
}
}
}
A program kimenete:
Teszt1 kiértékelése...
Teszt2 kiértékelése...
Teszt2 kiértékelése...
Teszt1 kiértékelése...
Teszt1 kiértékelése...
Teszt2 kiértékelése...
A kódban Teszt1() és Teszt2() metódusok. Ezek létrehozásáról a késÅ‘bbiekben lesz szó. A kódban a lényegi rész az eddig tanult if szerkezet. Az elsÅ‘ két esetben azt tapasztaljuk, hogy az operátor jobb és bal oldalán álló metódus is meghÃvódik. Az elsÅ‘ és kapcsolatot tartalmazó if esetében azonban bÅ‘ven elég lenne meghÃvni az elsÅ‘ metódust, mivel az hamis értéket ad vissza. EbbÅ‘l következÅ‘en Teszt2 lefuttatása felesleges, mert ha az még igaz értéket is adna vissza, akkor sem teljesülne a feltétel.
A második esetben szintén lehetne jobb a végrehajtás. Itt Teszt2 hÃvódik a példa kedvéért, ami igaz értéket ad vissza. A vagy művelet igazságtáblázatából kikövetkeztethetÅ‘, hogy ha egy kifejezés rendelkezik egy igaz taggal, akkor az a kifejezés mindig igaz lesz. Tehát ebben az esetben felesleges Teszt1 hÃvása.
A harmadik és negyedik if esetén tapasztaljuk a duplázott operátorok jelentÅ‘ségét. A harmadik esetben csak Teszt1 fut le, mÃg a negyedik esetben csak Teszt2 fut le, a korábban emlÃtett okokból kifolyólag.