C#, winform. Ez a kód miért add null-t vissza?
Malomjátékot írok, ahol lehet a gép ellen játszani.
Bárhol máshol használok hasonló(controls foreach) kódot működik, de itt nem
Button computerChooseRandomButtorForMove()
{
Button b=null;
foreach (Control c in Controls)
{
try
{
if (c.Text == "O")
{
b = (Button)c;
break;
}
}
catch (Exception)
{
}
}
return b;
}
Itt a teljes kód:
http://pastebin[pont]com/rRyad4zU
Hú de hányadék ez a kód.
Esetleg debugolhatnád.
Tipp, hogy nem a Controlokhoz van hozzáadva a gomb, vagy van más olyan Control, aminek a Text-je "O".
Button b = null;
...
return b;
Ezért ad vissza null-t. Nem fedtél le közte minden esetet. Lehet nincsenek "Controls"-ok, vagy egyik Controls Text-je sem "O". Ekkor semmit se csinál a foreach-ed és visszaadja az inicializált értéket, vagyis a null-t.
Vagy elszáll invalidcastexception-nel, ahogy az első is írta ("vagy van más olyan Control, aminek a Text-je "O"")
Én a helyedben kiszedném a try-catchet, itt semmi értelme, pláne így hogy simán lenyeled az exceptiont.
Itt egy pár pro tip:
1) Ha van egy változód és meg akarod vizsgálni, hogy az egy adott osztály példánya-e, akkor használd az is operátort:
foreach (var c in Controls)
.. if (c is Button) ...
2) Típuskényszerítés helyett használhatod az as operátort:
Button b = c as Button;
Ha netán c mégsem Button, akkor b értéke null lesz. És fontos, hogy ez nem dob kivételt!
"Én a helyedben kiszedném a try-catchet, itt semmi értelme, pláne így hogy simán lenyeled az exceptiont."
Azért kell a try catch mert nem minden control button, és azért nem kezelem le, mert csak a gombokra van szükségem.
@4
Köszönöm a tanácsot, kipróbálom
@1
Igen, valóban hányadék, én sem látom át. Tudnál(tudnátok) pár tanácsot adni, hogyan tehetném olvashatóvá?
Próbáltam a gép lépéseit átrakni egy másik osztályba, de nem találtam arra megoldást, hogy hogyan kezelhetem onnan a gombokat.
1. Használj objektumorientált szemléletet
2. Használj gyűjteményeket az ezer változó helyett
3. Használj ciklusokat/LINQ-t az ezer elágazás helyett.
Ezt ami itt ezer sor, szerintem kevesebb, mint 100 sorban meg lehet írni.
Hogy érted, hogy ezer változó helyett? Van benne vagy 5 db.
Az O1..O8, I1..I8, M1..M8 a gombok nevei
"Hogy érted, hogy ezer változó helyett? Van benne vagy 5 db.
Az O1..O8, I1..I8, M1..M8 a gombok nevei"
És azok szerinted nem változók?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!