Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[c#] switch nach Objekt

Empfohlene Antworten

Veröffentlicht

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.

}

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.

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.

  • Autor

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.

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 ?

  • Autor

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.

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.

  • Autor

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

}

}

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

  • Autor

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.

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

  • Autor

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?

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:

  • Autor

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.

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.

  • Autor

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.

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 ;)

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:

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:

  • Autor

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.