Verktyg Visningsval
2012-04-13, 03:36   #1

Murloc

Medlem

Plats: Stockholm

Registrerad: maj 2010

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?
__________________
ASUS Maximus VI Gene - i7 4770K - Sapphire HD 7970 - 16GB Corsair DDR3 1600Mhz - Samsung 840 Evo 500GB, Western Digital Red 3TB - Corsair AX760
Murloc är inte uppkopplad
2012-04-13, 03:47   #2

swehunter2000

Medlem

swehunter2000s avatar

Plats: östersund

Registrerad: jan 2011

en function
__________________
CPU: I7 4770k Noctua DH-14 MOBO: Maximus VI Hero GPU: Nvidia 780 RAM: 16 GB Corsair RAM 1600 MHz SSD: Corsair force GT 120 GB, OC Agility 3 120 GB HDD: Samsung 1TB, WD 2TB Chassi: R4 PSU: Corsair AX860 Ljud: Asus Xonar D2X Hörlurar: AKG K 240 MK II Högtalare: Logitech X-530 Mus: Logitech G500s Matta: Steelseries QcK Mini Skärmar: en BenQ 22' och en Samsung 19'. V.v. citera mig för att få svar.
swehunter2000 är uppkopplad nu
2012-04-13, 03:50   #3

swehunter2000

Medlem

swehunter2000s avatar

Plats: östersund

Registrerad: jan 2011

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

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

Om jag inte kommer ihåg helt fel..
__________________
CPU: I7 4770k Noctua DH-14 MOBO: Maximus VI Hero GPU: Nvidia 780 RAM: 16 GB Corsair RAM 1600 MHz SSD: Corsair force GT 120 GB, OC Agility 3 120 GB HDD: Samsung 1TB, WD 2TB Chassi: R4 PSU: Corsair AX860 Ljud: Asus Xonar D2X Hörlurar: AKG K 240 MK II Högtalare: Logitech X-530 Mus: Logitech G500s Matta: Steelseries QcK Mini Skärmar: en BenQ 22' och en Samsung 19'. V.v. citera mig för att få svar.
swehunter2000 är uppkopplad nu
2012-04-13, 04:31   #4

Murloc

Medlem

Plats: Stockholm

Registrerad: maj 2010

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?
__________________
ASUS Maximus VI Gene - i7 4770K - Sapphire HD 7970 - 16GB Corsair DDR3 1600Mhz - Samsung 840 Evo 500GB, Western Digital Red 3TB - Corsair AX760
Murloc är inte uppkopplad
2012-04-13, 05:52   #5

tgwallenborg

Medlem

Registrerad: sep 2011

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
__________________
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
tgwallenborg är inte uppkopplad
2012-04-13, 06:48   #6

jovnas

Medlem

jovnass avatar

Plats: Göteborg

Registrerad: maj 2004

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
__________________
as far as we can tell, the massacre went well...
jovnas är inte uppkopplad
2012-04-13, 08:58   #7

ministerkrister

Medlem

ministerkristers avatar

Plats: Uppsala

Registrerad: apr 2007

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:
    ...
   }
}
__________________
The statement below is true.
The statement above is false.
ministerkrister är inte uppkopplad
2012-04-13, 09:41   #8

Mikael07

Medlem

Mikael07s avatar

Plats: Göteborg

Registrerad: mar 2011

Citat:
Ursprungligen inskrivet av Murloc Visa inlägg
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.
__________________
.:: Linux Mint :: i5 2500k :: Gainward GTX580 Phantom :: XMS3 8Gb :: Seagate 2Tb ::.
Mikael07 är inte uppkopplad
2012-04-13, 09:47   #9

ErDraug

Medlem

ErDraugs avatar

Plats: Borås

Registrerad: sep 2008

Använd inte GoTo... Snälla... Men annars ja du måste lägga den på 100 ställen är nog enklaste sättet.
__________________
| 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 :)
ErDraug är inte uppkopplad
2012-04-13, 14:08   #10

JasPlan

Medlem

Plats: Stockholm

Registrerad: sep 2009

Citat:
Ursprungligen inskrivet av ministerkrister Visa inlägg
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:
    ...
}
__________________
CPU: Intel 3930k @ 4.5GHz (Vattenkyld) MB: Asus Rampage Extreme IV X79 (Vattenkyld) GPU: 2st GTX680 2GB @ 1200MHz (Vattenkyld) RAM: 32GB @ 1866MHz Chassi: Enermax Fulmo GT PSU: Silverstone Platinum 1000W SSD: 2st Vertex 4 256GB (RAID 0) HDD: 2st WD Green 2TB Skärmar: 2st Dell U2412m Ljudinterface: Propellerhead Balance Högtalare: 2st Genelec 8020BPM
JasPlan är inte uppkopplad
2012-04-14, 09:19   #11

DeluxXxe

Medlem

DeluxXxes avatar

Plats: Karlskrona

Registrerad: feb 2007

Citat:
Ursprungligen inskrivet av JasPlan Visa inlägg
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!
__________________
NZXT H440 | Corsair VX450 | Gigabyte ma785gmt-us2h | Phenom X6 1045T | Noctua NH-U12F | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Powercolor 280X PCS | DELL 2713HM | DELL 2209WA | Coolermaster quickfire | Razer Deathadder 2013
DeluxXxe är inte uppkopplad
2012-04-14, 09:45   #12

SolidReactor

Medlem

Plats: göteborg

Registrerad: nov 2002

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!
SolidReactor är inte uppkopplad Folding
2012-04-14, 10:07   #13

DeluxXxe

Medlem

DeluxXxes avatar

Plats: Karlskrona

Registrerad: feb 2007

Citat:
Ursprungligen inskrivet av SolidReactor Visa inlägg
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.
__________________
NZXT H440 | Corsair VX450 | Gigabyte ma785gmt-us2h | Phenom X6 1045T | Noctua NH-U12F | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Powercolor 280X PCS | DELL 2713HM | DELL 2209WA | Coolermaster quickfire | Razer Deathadder 2013
DeluxXxe är inte uppkopplad
2012-04-14, 16:48   #14

KurreKula

Medlem

KurreKulas avatar

Plats: Bromma

Registrerad: aug 2008

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
__________________
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
KurreKula är inte uppkopplad
2012-04-14, 23:10   #15

ministerkrister

Medlem

ministerkristers avatar

Plats: Uppsala

Registrerad: apr 2007

Citat:
Ursprungligen inskrivet av JasPlan Visa inlägg
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
__________________
The statement below is true.
The statement above is false.
ministerkrister är inte uppkopplad
Senaste nyheterna

Redaktionens senaste nyhetsrubriker

Sök jobb