Kezdőoldal » Számítástechnika » Programozás » C#, winform. Ez a kód miért...

C#, winform. Ez a kód miért add null-t vissza?

Figyelt kérdés

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



2016. júl. 11. 10:49
 1/10 anonim ***** válasza:

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".

2016. júl. 11. 11:07
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:

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.

2016. júl. 11. 11:51
Hasznos számodra ez a válasz?
 3/10 anonim ***** válasza:

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.

2016. júl. 11. 12:10
Hasznos számodra ez a válasz?
 4/10 anonim ***** válasza:

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!

2016. júl. 11. 12:30
Hasznos számodra ez a válasz?
 5/10 A kérdező kommentje:

"É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.

2016. júl. 11. 12:46
 6/10 anonim ***** válasza:

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.

2016. júl. 11. 13:31
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:
1000 sor a fenéket... 1700...
2016. júl. 11. 13:31
Hasznos számodra ez a válasz?
 8/10 A kérdező kommentje:

Hogy érted, hogy ezer változó helyett? Van benne vagy 5 db.

Az O1..O8, I1..I8, M1..M8 a gombok nevei

2016. júl. 11. 14:10
 9/10 anonim ***** válasza:
A 400 elágazást érdemes ciklusba foglalni. Ha azt látod, hogy a kódban ismétlés van, akkor függvénybe kiemelni. Stb. A lényeg az átláthatóság és a könnyen bővíthetőség.
2016. júl. 11. 16:33
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:

"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?

2016. júl. 11. 16:57
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!