Array problem



  • Hallo Leute

    ich hab ein Problem an dem ich schon seit 2 Wochen fest hänge. Komme einfach nicht weiter.

    ich habe in eine Klasse eine Eigenschaft eingebaut, nämlich farben:

    public class Auto
        {
    
            private string[] farben = {"blau", "rot", "grün", "gelb", "schwarz", "silber"};
    
            private string farbe = "blau";
            farbe = farben[0];
        }
    

    die Klasse ist eigentlich noch länger, aber den kram hab ich jetzt einfach mal weg gelassen. Klar sonst würde private hier keinen Sinn ergeben.

    Das Problem:

    bei

    farbe = farben[0];
    

    meckert der Compiler:

    Invalid token ';' in class, struct, or interface member declaration (CS1519) - C:\Dokumente und Einstellungen\User\Desktop\C# Projekte\Konsolenanwendung Test\Auto.cs:27,23

    Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) (CS0270) - C:\Dokumente und Einstellungen\User\Desktop\C# Projekte\Konsolenanwendung Test\Auto.cs:27,21

    Invalid token '=' in class, struct, or interface member declaration (CS1519) - C:\Dokumente und Einstellungen\User\Desktop\C# Projekte\Konsolenanwendung Test\Auto.cs:27,12

    alles was ich will ist, eine Eigenschaft als Array festlegen. Und die Eigenschaft farbe soll einen Standardwert bekommen, den ich aus dem Array ziehe, das ich zuvor erstellt habe.

    Oder habe ich hier ein grundsätzliches Logikproblem?

    Also zu meiner Anwendung:

    Die Klasse Auto soll ein Objekt, also ein Kraftfahrzeug beschreiben. Es ist just for fun zur Übung. Man kann dem Auto mit einer Methode namens lackieren eine Farbe zuweisen.

    Nun möchte ich aber, das in einem Array alle verfügbaren Farben abgelegt werden, so wie oben. Die Methode lackieren soll sich diesem Array bedienen und dann schauen ob die gewünschte Farbe vorhanden ist oder nicht.

    Das Array will ich aber nicht innerhalb dieser Methode lackieren festlegen, weil ich nämlich auch in anderen Fällen dieses Array aufrufen will um z.B. die Anzahl verfügbarer Farben oder die Farben selbst in der Konsole auszuwerfen.

    Ich habe schon sehr viel probiert... auch das hier:

    innerhalb der Klasse Auto:

    static public string[] Farben 			//Eigenschaftsmethode
    		{
    			get
    			{
    				string[] farben = {"blau", "rot", "grün", "gelb", "schwarz", "silber", "rosa"};
    				return farben;
    			}
    		}
    
    private string farbe = Farben[5];
    

    das hier hat funktioniert. Aber *warum* muss ich das Array in einer Eigenschaftsmethode instanziieren?? Mir sagte ein C#-Experte einfach nur ganz plump, das wäre dumm. Aber warum, wollte er mir nicht sagen.

    Dieser sagte mir dazu nur noch was auf Chinesisch:

    de Lösung ist, die Initialisierung in den Konstruktor zu packen. Damit kannst du alles wie oben machen (was auch besser wäre, als deine jetzige Lösung), nur eben dass die angemeckerte Initialisierung (also eine Zeile) in den Konstruktor wandert.

    Vielleicht ist hier jemand der Ahnung hat und nicht so Anfänger-feindliche telegrammstilartige Antwortfetzen von sich gibt, mit denen man mehr anfangen kann 😞 ...habe mich auch eingehend mit der Doku und dem Openbook befasst - nirgends wird mein Problem erörtert, zumindest nicht in für Anfägner verständlicher Form. Scheint eine Marktlücke zu sein 😉

    also bin für jede Hilfe sehr dankbar

    gruß
    Fuchs



  • Deine Programmlogik gehört in einen Konstruktor.
    Innnerhalb der Klasse kannst du Membervariablen nur mit Konstanten bzw. new() initialisieren, aber nicht auf andere Member zugreifen.



  • Membervariablen sind Eigenschaften, richtig?

    Und eine Konstante wäre z.B. die 5 in:

    int zahl = 5;
    

    ?



  • Die 5 ist keine Konstante sondern ein Literal. Das Wort Konstante wird da aber schon von hmm, falsch verwendet da er höchstwahrscheinlich auch Literale meint. Wenn man Konstanten in der Form

    readonly int MeineSuperZahl = 5;
    

    hat, dann darf man außerhalb von Funktionen oder des Konstruktors auch nicht

    int x = MeineSuperZahl;
    

    schreiben, weil Zuweisungen nur innerhalb von Funktionen erlaubt sind.

    Und Membervariablen sind keine Eigenschaften! In anderen Sprachen vielleicht, aber in C# bzw. .Net allgemein, hat der Begriff Eigenschaft ne eigene spezielle Bedeutung.



  • Du solltest besser eine Aufzählung (Enumerierung) verwenden, z.B. so

    public class Auto
    {
      private enum Farbe
      {
        Blau, Rot, Gruen, Gelb, Schwarz, Silber
      };
    
      private string[] farben =
      {
        "blau", "rot", "grün", "gelb", "schwarz", "silber"
      };
    
      private Farbe m_farbe = Farbe.Blau; // Member mit Initialisierung
    
      Auto()  // Konstruktor
      {
        m_farbe = Farbe.Rot; // alternative Initialisierung
      }
    
      string AutoFarbe  // Eigenschaft (property)
      {
        get { return farben[m_farbe];
      }
    }
    

    Such dir am besten ein Buch (oder Tutorial) und arbeite das von vorne bis hinten durch.


Anmelden zum Antworten