myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Unterschiede von Deklaration von Arrays auf Klassenebene vs. in Funktion
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Unterschiede von Deklaration von Arrays auf Klassenebene vs. in Funktion

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Tidy Lobster
myCSharp.de-Mitglied

Dabei seit: 17.03.2016
Beiträge: 13


Tidy Lobster ist offline

Unterschiede von Deklaration von Arrays auf Klassenebene vs. in Funktion

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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:

C#-Code:
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:

C#-Code:
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.
27.11.2018 15:44 Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.975
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am 27.11.2018 16:09.

27.11.2018 16:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.014


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
28.11.2018 17:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tidy Lobster
myCSharp.de-Mitglied

Dabei seit: 17.03.2016
Beiträge: 13

Themenstarter Thema begonnen von Tidy Lobster

Tidy Lobster ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank für die super Antworten!

Habe meine Fehler nun verstanden und auch warum das so nicht sinnvoll ist. :)
29.11.2018 12:29 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.11.2019 05:25