C# Array mit mehreren Typen

Spartan-117

Cadet 3rd Year
Registriert
Nov. 2010
Beiträge
41
Hallo,

Da ich meiner Meinung nach mit PHP recht gut umgehen kann, dachte ich mir, dass ich mal eine andere Programmier- oder Scriptsprache suche. Naja, ich habe heute mit C# angefangen und bin auch sehr zufrieden, da es mir auch Spass macht damit zu programmieren. Nur leider habe ich mit PHP nie wirklich mit Exceptions gearbeitet, deshalb muss ich das in C# nochmal aufrollen. Nun sitze ich gerade an benutzerdefinierten Exceptions und wollte mir dabei verschiedene Errorcodes zu Nutze machen. Um die Übersicht zu behalten, wollte ich diese in einem Array mit dem dazugehörigen String(einfache Beschreibung) speichern.

In PHP war dies leicht umzusetzen(dank der schwachen Typisierung):
PHP:
$Errors = array(
403 => array(403, "Zutritt verboten"),
404 => array(404, "Nicht gefunden")
);

function handleError($errcode) {
echo $Errors[$errcode][1]; // Damit würde ich dann die Beschreibung des Fehlers bekommen
}

Ich weiss, dass dieses Beispiel nicht sehr logisch ist, jedoch erfüllt es seinen Zweck. :P
Da bei C# jedoch beispielsweise ein int davor stehen muss, kann man dann ja nur diesen Typ benutzen im Array.

Wie gesagt, ich bin blutiger Anfänger in C#, jedoch weiss dazu wirklich keine Lösung. Google leider auch nicht. :(

Ich hoffe ihr könnt mir helfen, oder mir eine effizientere/bessere Lösung präsentieren :)
 
Keine Ahnung ob irgendeine Exception das schon bereitstellt, aber erb doch von der Klasse und füge einen Errorcode hinzu. Dann machst du einfach ein Array von dieser Klasse und setzt die jeweiligen Parameter.

Ansonsten: Sieh dir mal Strukturen an, damit kannst du ebenso Daten zusammenfassen.
Code:
class MyException : Exception
{
  public int ErrorCode;

  public MyException( int ErrorCode, string Message ) { this.ErrorCode = ErrorCode; this.Message = Message; }
}

// ...
MyException[] exps = new MyException[] {
  new MyException( 403, "Zutritt verboten" ),
  new MyException( 404, "Nicht gefunden" );
};
// ...
 
Erstell dir doch einfach selbst einen Typ "ErrorType" , der als Instanzvariablen ein integer und einen String hat.
Oder noch besser: Speichere das ganze in eine Map mit Fehlercode als Schlüssel, und Fehlerbeschreibung als Wert.
 
Also eins muss ich euch lassen, ihr seid echt schnell! :)

@Yuuri: Stimmt, bei C# kann man ja aus allem ein Array machen. Ganz schön praktisch, danke. ;)

@fresco: Ich werd mich da mal durchlesen, danke. :)

@DjNDB: Ist damit nicht das von fresco genannte Dictionary gemeint? Wenn nicht, bitte erklären. :)

€: Wenn ich das hinkrieg, werde ich den Code hier posten. ^^
 
Spartan-117 schrieb:
@DjNDB: Ist damit nicht das von fresco genannte Dictionary gemeint? Wenn nicht, bitte erklären. :)

Ja, ist es. Das war zeitgleich geposted, und da ich kein .NET mache, habe ich die generische Datenstruktur beschrieben.
 
So, mit eleganter Verspätung:
Code:
class ExceptionHandler : Exception
{
    public ExceptionHandler(int errcode)
    {
        Dictionary<int, string> Errors = new Dictionary<int, string>();
        Errors.Add(403, "Zutritt verboten!");
        Errors.Add(404, "Nicht gefunden!");
        if (Errors[errcode] != null)
        {
            MessageBox.Show("Fehler: " + Errors[errcode]);
        }
        else
        {
            MessageBox.Show("Unbekannter Fehler!");
        }
    }
}
Und zum werfen:
Code:
throw new ExceptionHandler(Fehlercode);
So in etwa sollte das stimmen.
Ist zwar nicht sehr nützlich, aber ich übe ja noch. :)
 
Zuletzt bearbeitet:
@Spartan, ich hätte zwei Anmerkungen zu deinem Code.

1. "ExceptionHandler" Wäre eine Methode die eine Exception behandelt, aber kein ExceptionTyp. Will nur sagen das die Namensgebung hier ein wenig wirr ist.

2. Eine MessageBox hat in einer Exception deines Typs nichts zu tuen, stell dir vor du willst deine Exceptionklasse in einem Konsolenprojekt verwenden dann musst du die Klasse wieder umschreiben, weil es da keine Messagesboxes gibt. Du willst ja unabhängig von drüber liegenden System bleiben. Alternativvorschlag meinerseits wäre also, das du der Klasse einfach eine Property verpasst die den momentanten Status wieder gibt.
 
Zurück
Oben