Zum Inhalt springen

[c#] switch nach Objekt


Empfohlene BeitrÀge

Geschrieben

Hallo,

gibt es (außer if-then) eine Möglichkeit per switch-case Objekte abzufragen, also zum Beispiel so.

CMyClass mc0 = new CMyClass();

CMyClass mc1 = new CMyClass();

CMyClass mc2 = new CMyClass();

CMyClass mc3 = new CMyClass();

CMyClass actual;

void run()

{

actual = mc0;

switch(actual)

{

case mc0:

...

usw.

}

Geschrieben

hmm.. meines wissens nicht, denn case verlangt einen Ausdruck wie z.B. einen string oder einen Wert, und lÀsst kein objekt zu.

du könntest aber ĂŒber den objektnamen gehen, der dir dann "mc[n]" zurĂŒckgibt und somit ließe sich das in eine switch case struktur einbauen.

Musst nur aufpassen daß du nicht den BaseName zum Vergleich heranziehst, denn der wĂ€re immer "CMyClass" in deinem Besispiel.

Geschrieben

So in der Art hab ichs jetz auch:

also die Klasse hat nen Name (string) und danach wird geswitcht.

Allerdings ist das sehr störanfÀllig weil man schnell Schreibfehler macht.

Geschrieben
gibt es (außer if-then) eine Möglichkeit per switch-case Objekte abzufragen, also zum Beispiel so.

Meines Wissens können unter C# keine Objekte fĂŒr das 'Switching' verwendet werden.

Du kannst ja eine eindeutige Variable fĂŒr jedes Objekt erzeugen lassen. (Z.B. Hashcode oder eben wie bereits erwĂ€hnt den Namen) und diese dann prĂŒfen.

Eine Enumeration wĂŒrde hier glaub ich auch gehen.

Geschrieben

Die Objekte sollen jeweils noch Parameter- und Wert-Felder haben.

Deshalb möchte ich keinen enum nehmen.

Gibts denn noch eine bessere Möglichkeit als den Namensstring der Objekte abzufragen?

ID möcht ich ungern nehmen, da dies die Leserlichkeit des Codes verschlechtert.

Geschrieben
Die Objekte sollen jeweils noch Parameter- und Wert-Felder haben.

Deshalb möchte ich keinen enum nehmen.

Gibts denn noch eine bessere Möglichkeit als den Namensstring der Objekte abzufragen?

ID möcht ich ungern nehmen, da dies die Leserlichkeit des Codes verschlechtert.

Also ich hab nochmal nachgeschaut und Objekte funktionieren wirklich nicht.

Switch Statement & Objects - .NET C#

The switch statement only supports numbers & strings, it does not support

objects.

Also entweder du schreibst selber eine Type-Safe-Enumeration, gehst ĂŒber foreach oder machst ein schönes if-else.

Was willst du eigentlich prĂŒfen mit dem Switch ?

Geschrieben

Ich hab ne Klasse, die verschiedene Schritte nacheinander ausfĂŒhrt.

Jeder Schritt ist ne eigene Klasse (mit eigenen Parametern).

Da die AktivitĂ€ten aller Schritte nicht in einzelnen Funktionen stehen sollen, gibt es eine Funktion in der mit switch-case der aktuelle Schritt geprĂŒft wird und abhĂ€ngig davon dann die gewĂŒnschte AktivitĂ€t ausgefĂŒhrt wird.

Geschrieben

Aus der Kalten wĂŒrde ich sagen, dass du einfach ein Interface benutzt, welches eine Funktion implementiert, die dann jede Klasse besitzt.

Diese leitet dann einfach an die entsprechende Funktion weiter oder so. Dann kannst du dir Switching auch sparen. ;)

MĂŒsst ich mir aber genauer anschauen.

Geschrieben

So sollte es sein:

Schritt1 = Ausgabe; Parameter = "Geben Sie einen Wert ein";

Schritt2 = Auf Eingabe warten; Parameter = "5 Sekunden";

Schritt3 = Eingabe auswerten

in einer Endlosschleife steht dann:

{

Aktuell = Schritt1;

switch(Aktuell)

{

case Schritt1:

Gehe zu Zeile x und Schreibe den Text aus Parameter hin

case Schritt2:

Warte darauf, bis der Nutzer etwas eingibt

u.s.w

}

}

Geschrieben

Schritt2 = Auf Eingabe warten; Parameter = "5 Sekunden";

Ich fĂŒr meinen Teil, wĂŒrde hier lieber Parameter = 5 (Integer) nehmen.

Sekunden kannst du dann immer noch dazudichten.

Ansonsten stellt sich fĂŒr mich die Frage, warum du die Sachen nicht als Variablen implementierst ?

Text ausgaben ect. funktionieren ja auch so.

btw: eine Klasse fĂŒr einzelne Schritte halte ich nicht fĂŒr effizient

Geschrieben

Das war nur der grobe Ablauf, also so wie ich mir das vorstelle.

@Klotzkopp:

In jedem case wird in Aktuell der nÀchste Schritt gesetzt.

@TDM:

Das mit den Sekunden ist schon klar, das war nur beispielhaft.

Momentan besteht ein Parameter aus einem Namen und einem Wert.

Meine Aufgabe ist, ne StateMachine zu entwickeln, zu der ich SubStates hinzufĂŒgen kann und jedem State möglichst noch Parameter ĂŒbergeben kann.

In einer bestehenden Anwendung war das so gelöst, dass man mit Add(funktion) eine neue Funktion (aus einem Delegaten) anfĂŒgen konnte, welche dann ausgefĂŒhrt wurde.

Allerdings hatte das den Nachteil, das man dann mitunter 50 Funktionen hat.

Deshalb wollte ich anstreben, die 50 Schritte in eine einzige Funktion zu packen.

Geschrieben

Naja, aber die Schritte bleiben doch gleich oder stellst du dann die neuen Funktionen in der Ausgabe zur VerfĂŒgung ?

Es gibt sowas wie Add(funktion) ?

Die implementiert eine Funktionkomplet mit Methodenrumpf und so ? :eek

Ich glaub ich sollte auch mal C# lernen... Dann brauch ich mich nicht wie bei Java und C++ mit Kompilieren rumschlagen. :D

Geschrieben

NatĂŒrlich bleiben die Schritte gleich.

Allerdings mĂŒsste noch ein Schritt hinzu, und zwar der "IDLE"-Schritt.

Sozusagen das Nichts-Tun.

Der wĂŒrde vorm Start des ganzen und nach dem Auswerten der Eingabe laufen.

Es gab eine Add(funktion)-Funktion. Dieser wurde als Parameter eine Funktion ĂŒbergeben, in der stand, was bei diesem Schritt zutun ist.

Allerdings entstehen durch 30 Adds auch 30 Funktionen...

Wieso mit Kompilieren rumschlagen?

Geschrieben

hmm ich dachte der schreibt die Klasse um :D

ich wĂŒrde eher sowas machen wie:

getParameter(int schritt) bzw. doSchritt(int schritt) und getAusgabe(int Schritt)

dann kannst du auch dein Switching auch benutzen.

Vielleicht denk ich auch grad vollkommen in die verkehrte Richtung :rolleyes:

Geschrieben

Hm...

also am Ende mĂŒsste es so ne Art Topf sein, wo ich paar Ablaufschritte reintun kann und bestimmen kann wie die nacheinander aufgerufen werden sollen, bzw. wie bei einer Verzweigung zu verfahren ist.

Anschließend drĂŒck ich auf Start und der Topf köchelt vor sich hin und fĂŒhrt die Schritte nacheinander aus.

Jetzt möchte ich gern ne Basis-Klasse die quasi den Topf grob beschreibt. Und dann noch eine Steuerungsklasse, welche vom Topf erbt. Und die FunktionalitĂ€t der Schritte hinzufĂŒgt.

Hinzu kommt die Sache, dass jeder Schritt vielleicht auch noch einen Parameter haben kann.

Die Sache mit der Add()-Funktion finde ich ja genial, aber ich brÀuchte dann halt ne Möglichkeit, das, was sonst in 20 Funktionen stÀnde, in eine einzige zu packen.

Geschrieben

Ich wĂŒrde die Schritte mit einem Integer reprĂ€sentieren. Diese werden dann in einer Collection gespeichert. Durch die Methode doSchritt(int schritt) kannst du dann die einzelnen Schritte ausfĂŒhren.

Es ist nur die Frage, ob du Zahlen eingeben lÀsst oder Text als Schrittaufruf.

Geschrieben

Die Eingabe findet am Ende höchstwahrscheinlich nicht statt. Das war nur als Beispiel.

In den Schritten stehen BewegungsablÀufe einer Maschine.

Und was meinst du dazu, wenn ich die Schritte wie gehabt als einzelne Objekte mache und jedem eine ID gebe.

Und anschließend die ID's einem ENUM zuordne.

Dann könnte ich ja nach ID's switchen.

Geschrieben

Zu viel Aufwand.

Wenn du schon eine ID hast, dann kannst du die dann in einer Variable speichern und dann z.B. Folgendes machen:


int ID = obj.getID();

switch (ID) {

case MyClass.ID_one:

//...

break;

case MyClass.ID_two:

//...

break;


//...

}

WĂŒrd ich jedenfalls so meinen. Aber ist natĂŒrlich dir ĂŒberlassen ;)

Geschrieben

Ja... wenn das funktionieren wĂŒrde.

Aber man kann nur nach konstanten ints casen.

Also 1,2,3,4, oder "a", "b",...

aber nicht nach obj.ID oder so.

Das ist ja das blöde.

Geschrieben

public class MyClass {

 static const int ID_one = 1;

 static const int ID_two = 2;

}
public class Luncher{


 void run()

 {

  ...

  int ID = obj.getID();

  switch (ID) {

  case MyClass.ID_one:

  //...

  break;

  case MyClass.ID_two:

  //...

  break;


  //...

  }

}

:mod:

Geschrieben

Naja, Enumerations können auch Objekte als Typen enthalten (nur dass du wegen einem privaten Konstruktor keine zusÀtzlichen Objekte erzeugen kannst.)

Hoffentlich hau ich jetzt nicht allzuviel zwischen Java und C# durcheinander. :rolleyes:

Geschrieben

Also soweit ich c# jetzt verstanden habe, definiere ich nen enum folgender Maßen:

enum MyEnum

{

int R = 1,

int G = 2,

int B = 3

}

und darauf zugreifen kann ich ĂŒber

MyEnum m_eMy;

m_eMy.R // -> ergibt 1

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto fĂŒr unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die grĂ¶ĂŸte IT-Community
rund um Ausbildung, Job, Weiterbildung fĂŒr IT-FachkrĂ€fte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard fĂŒr Fachinformatiker und IT-FachkrĂ€fte

×
×
  • Neu erstellen...