Laden...

Unterschiede von Deklaration von Arrays auf Klassenebene vs. in Funktion

Erstellt von Tidy Lobster vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.084 Views
T
Tidy Lobster Themenstarter:in
13 Beiträge seit 2016
vor 5 Jahren
Unterschiede von Deklaration von Arrays auf Klassenebene vs. in Funktion

Hallo Community,

nachdem ich durch eigenhändige Recherche nicht fündig geworden bin, wende ich mich an euch.
(Ist vermutlich wieder mal was banales und grundlegendes, was sich meinem Verständnis entzieht.)

Mir ist aufgefallen, dass bei der Deklaration von Arrays anscheinend der Syntax eine Rolle spielt, je nachdem ob ich es in einer Methode oder einer Klasse definiere.

Auf folgende Weise könnte ich ja Arrays in einer Methode definiere:

Beispiel:


 class Test
    {
        void Test1()
        {
            string[] arr1 = new string[3];
            arr1[0] = "Test";
            arr1[1] = "Test";
            arr1[2] = "Test";

            string[] arr2 = new string[3] {"Test", "Test", "Test" };
        }
    }

Bis hierhin alles ganz normal.

Will ich nun einen Array in diesem Muster in einer Klasse und nicht einer Methode definieren bekomme ich den einen Fehler.

Beispiel:

class Test
    {
            string[] arr = new string[3];
            arr[0] = "Test";
            arr[1] = "Test";
            arr[2] = "Test";
    }

Diese Art der Deklaration hingegen funktioniert wiederrum in einer Klasse.

Beispiel:

class Test
    {
           string[] arr = new string[3] { "Test", "Test", "Test" };
    }

Kann mir jemand bitte auf die Sprünge helfen? Diverse Google-Versuche blieben bis jetzt ergebnislos.

Vielen Dank.

3.003 Beiträge seit 2006
vor 5 Jahren

Uh. Die Frage ist nachvollziehbar, wenn man versucht, einmal alles zu vergessen, was man über Klassen weiß. Ich versuch es so einfach wie möglich zu erklären, aber nichtsdestotrotz solltest du dir dringend die Grundlagen der OOP vertraut machen, dann stellen sich solche Fragen gar nicht 😃. Die Erklärung ist nicht 100% exakt, aber dafür hoffentlich verständlicher.

Erstens:
Deine Arrays erfüllen unterschiedliche Funktionen. In einer Methode sind sie lokale Variablen, in der Klasse sind sie Felder (interne "Mitglieder" der Klasse). Nur, weil sie jeweils den gleichen Typ haben, sind sie nicht dasselbe.

Zweitens:
C# gibt dir die Möglichkeit, ein Feld zu deklarieren und sofort zu initialisieren.


class Example 
{
    private string[] _myField = new string[3];
}

Normalerweise würde man ein Feld im Konstruktor der Klasse initialisieren. C# erlaubt eben auch diese Initialisierung. Was C# aber nicht erlaubt, ist eine Referenzierung (Bezugnahme) auf das Feld _myField außerhalb eines Methodenkontexts. Das Feld wird erst angelegt, wenn die Klasse Example mit new Example() instanziiert wird. Es wird also vorher recht schwierig, auf etwas Bezug zu nehmen, was noch nicht existiert. Davon abgesehen: wenn so etwas ginge, wann sollte es ausgeführt werden? Bei der Erzeugung des Objekts? Vorher? Vor dem Konstruktor? Nachher?

Drittens:
C# erlaubt bei Arrays die Direktinitialisierung mit Werten. Das ist die Notation mit den geschweiften Klammern und funktioniert auch bei statischer Initialisierung (Punkt 2). Wenn du ein Feld hast, das du nicht direkt initialisieren möchtest, dann initialisier es bitte im Konstruktor. Dafür ist er da.

Viertens:
Wenn du das Feld statisch initialisieren möchtest, aber keine Direktinitialisierung verwenden kannst (das ist bei alten C#-Versionen der Fall), dann nimm einen statischen Konstruktor. Das wird bei dir aber kaum der Fall sein.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
2.121 Beiträge seit 2010
vor 5 Jahren

Ich würde das so formulieren.

string[] _myField = ... legt fest dass _myField ein Array sein soll. Man kann in dieser Deklaration auch schon angeben was drin stehen soll. Deklarationen sind auch in einer Klasse erlaubt.

Die Zuweisung _myField[0] = ... ist ausgeführter Code. Code wird in einer Methode ausgeführt, aber nicht in der Klasse selbst.

T
Tidy Lobster Themenstarter:in
13 Beiträge seit 2016
vor 5 Jahren

Vielen Dank für die super Antworten!

Habe meine Fehler nun verstanden und auch warum das so nicht sinnvoll ist. 😃