C# - Gemensam kod för alla case i ett Switch statement

Permalänk
Medlem

C# - Gemensam kod för alla case i ett Switch statement

Om jag har ett Switch statement med väldigt många olika case och varje case har några rader gemensam kod, finns det då något sätt att få den gemensamma koden att köras vid varje case utan copy paste:a det överallt?

Permalänk
Medlem

en function

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem

Public Static Void ngtnamn{
kod..
kod...
kod..
}

case habbla habbla
ngtnamn; <-- kör funktionen "ngtnmn"

Om jag inte kommer ihåg helt fel..

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem

Var inte så jag menade, funktionen måste jag också copy paste:a på alla case. Vi säger att jag har hundra case som alla ska köra koden i funktionen, kan jag undvika att klistra in funktionen på hundra ställen?

Permalänk

Jag kan vara helt ute och cykla men kan du inte, det första du gör köra en default case där du skiter i break.
Är inte helt säker på att den väljer rätt case efter eller om det automatiskt hoppar in i case 1 men du kan ju testa.
T.ex
case (vilkor)
case default: koden()
case 1: blabla;
break;
osv

Visa signatur

Asrock Z68 Extreme 7 gen 3 | EVGA GTX580 SLI | Intel i7 2600k | Corsair Vengeance 16GB
Corsair H80 | Corsair Force 3 120gb | HX1050 |NZXT Phantom | Samsung 22" SA300

Sony VAIO pro 13
i7 8GB 256GB

Permalänk
Medlem

jag har förmodligen missuppfattat problemet, men om ALLA case skall köra vissa rader som är samma, så ska ju den koden inte ligga i switchen alls...

alternativt kan man ju köra en default, som tidigare nämnts, eller sätta så att flera olika case kör samma kod. observera att "fallthrough" inte fungerar i C# utan man måste explicit ange "goto" istället.

var result = string.Empty; switch (i) { case 1: result = functionA(i); break; case 2: // Do nothing break; case 3: case 4: result = functionB(8); // Körs för 3 och 4 break; case 5: result = functionC(50); goto case 1; // Hoppar till case 1 case 42: throw new Exception("Whoa! 42!"); default: // Körs om inget tidigare matchar result = functionX(); break; }

mer om switch på MSDN

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Du kanske ska göra två fall?

... if(condition) { switchMethod1(...); } else { switchMethod2(...); } ... private switchMethod1(...) { gemensamMetod(...); switch (i) { case 1: .... break; default: ... } } private switchMethod2(...) { switch (i) { case 1: .... break; default: ... } }

Visa signatur

The statement below is true.
The statement above is false.

Permalänk
Medlem
Skrivet av Murloc:

Var inte så jag menade, funktionen måste jag också copy paste:a på alla case. Vi säger att jag har hundra case som alla ska köra koden i funktionen, kan jag undvika att klistra in funktionen på hundra ställen?

Ja, du kan skriva den utanför switchen.

Permalänk
Medlem

Använd inte GoTo... Snälla... Men annars ja du måste lägga den på 100 ställen är nog enklaste sättet.

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem
Skrivet av ministerkrister:

Du kanske ska göra två fall?

... if(condition) { switchMethod1(...); } else { switchMethod2(...); } ... private switchMethod1(...) { gemensamMetod(...); switch (i) { case 1: .... break; default: ... } } private switchMethod2(...) { switch (i) { case 1: .... break; default: ... } }

varför krångla till det? han kan väl bara köra:

... if(condition) { gemensamMetod(...); } switch (i) { case 1: .... break; default: ... }

Permalänk
Medlem
Skrivet av JasPlan:

varför krångla till det? han kan väl bara köra:

... if(condition) { gemensamMetod(...); } switch (i) { case 1: .... break; default: ... }

Den sista var ganska bra, men han nämnde inte att det var något särskilt förhållande, bara att koden var tvungen att användas i varje case. Lägg det efter switch satsen:

switch (i) { case 1: .... break; default: ... } gemensamMetod(...);

Att man har massa logik i switch satser kan även tyda på att man kan bryta ut den logiken till klasser och subklasser. Istället för koden ovan hade du då kunnat använda något liknande detta:

http://pastie.org/3785146

Nu gjorde jag koden ovan i Java, men det är samma princip och nästan samma syntax i C#.

Detta gör att du isolerar antalet switchar till ett ställe, dvs där du skapar objekten. Det är bra om du tex har switch satser utspridda lite här och där, som switchat på samma sak, men gör olika saker. För varje ny sak du vill att alla switch-fall ska utföra, så lägger du istället till en metod och lägger beteendet i objektet istället för ett switch-case. Lycka till!

Visa signatur

AMD 5700X@Vatten | asus prime x370pro | Asus 2080 Strix | 2x16GB Kingston Fury Renegade RGB DDR4 3.6GHZ | Lian Li O11d EVO + 2x240 EKWB RAD + 6 Lian Li AL120 | CoolerMaster V850 | NVME 2TB Seagate Firecuda 510 + NVME 1TB WD BLACK + 3 SSD | Samsung Odyssey 49" G9| DELL 2713HM | Varmilo VA69 Clear/brown | Logitech G502 2016.

Phenom X6 1045T | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Gigabyte ma785gmt-us2h | Silverstone Temjin 08 | Corsair VX450

Permalänk
Medlem

Varför inte try/finally?

try { switch (i) { case 1: .......; break; case #: ........; break; default: ........; break; } } finally { gemensamKod(); }

Har inte testat koden, kommer från C++ och nyligen börjat med C# men de bör fungera galant!

Permalänk
Medlem
Skrivet av SolidReactor:

Varför inte try/finally?

try { switch (i) { case 1: .......; break; case #: ........; break; default: ........; break; } } finally { gemensamKod(); }

Har inte testat koden, kommer från C++ och nyligen börjat med C# men de bör fungera galant!

Try, catch, finally är till för återhämtande från fel. Här förekommer ingen felhantering och därför bör det inte heller användas. Om man vill göra det enkelt, men samtidigt kan tänka sig att ha logiken utspridd i flera switchar så är det mest logiska att placera "gemensamkod()" direkt efter switchen, men utan try, finally.

Visa signatur

AMD 5700X@Vatten | asus prime x370pro | Asus 2080 Strix | 2x16GB Kingston Fury Renegade RGB DDR4 3.6GHZ | Lian Li O11d EVO + 2x240 EKWB RAD + 6 Lian Li AL120 | CoolerMaster V850 | NVME 2TB Seagate Firecuda 510 + NVME 1TB WD BLACK + 3 SSD | Samsung Odyssey 49" G9| DELL 2713HM | Varmilo VA69 Clear/brown | Logitech G502 2016.

Phenom X6 1045T | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Gigabyte ma785gmt-us2h | Silverstone Temjin 08 | Corsair VX450

Permalänk

Det är sällan man ser så många dåliga förslag i samma tråd.

Ska koden köras för varje case så har den inget i switchen att göra. Hela syftet med en switch är ju till för att köra viss kod för vissa case, inte för alla. Default är endast till för de fallen när inget case har uppnåtts.

JasPlans lösning är den enda jag anser värdig

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Skrivet av JasPlan:

varför krångla till det? han kan väl bara köra:

... if(condition) { gemensamMetod(...); } switch (i) { case 1: .... break; default: ... }

Såklart jag var inte vid mina sinnens fulla bruk när jag skrev det där. Skämskudde framför ansiktet.

Skickades från m.sweclockers.com

Visa signatur

The statement below is true.
The statement above is false.