none
Split auf Übergabeparameter in Klassenkonstruktor verwenden

    Frage

  • Hallo liebe Leute,

    ich habe ein vermutlich leicht lösbares Problem, aber momentan seh ich keine andere Möglichkeit, als eure Expertise heranzuziehen. Ich bin relativ neu in C# und kämpfe etwas mit den Zugriffsrechten bei der Objektinitialisierung.

    Ich schreibe gerade eine Klasse 'Path' an welche ich einen Pfad über den Konstruktor übergebe, wie folgt:

    class Path
        {
            public Path(string path_org)
            {
                path = path_org;
            }
         }

    Diese Klasse soll auch ein Array 'path_elements[]' enthalten, das ich über den Split des über den Konstruktor übergebenen Originalpfad 'path_org' bekomme. Hierfür weise ich zunächst 'path_org' an 'path' zu, welche eine private Membervariable in der Klasse sein soll.

    Auf diese Variable möchte ich in der Klasse zugreifen und unter anderem die Pfadelement im Array speicher und den Filenamen extrahieren. Das sieht dann wie folgt aus:

    class Path
        {
            public Path(string path_org)
            {
                path = path_org;
            }

           static private string path;
           public string[] path_elements = SplitPath(path);

           static private string[] SplitPath(string p)
            {
                string[] path_el;
                path_el = p.Split('\\');
                return path_el;
            }
    }


    Dabei ergibt sich folgendes Problem:

    System.NullReferenceException: 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.'

    und zwar hier: path_el = p.Split('\\');

    Mir ist auch bewusst, warum er meckert, nämlich weil der Pfad, den er splitten soll, noch null ist, da die Methode aufgerufen wird bevor der Konstruktor der Klasse ausgeführt wird. Somit übergebe ich einen leeren String an die Methode 'SplitPath'. Die Methode habe ich als 'private' deklariert, da ich sie nicht im Programm aufrufen möchte. Die Zerlegung soll die Klasse im Verborgenen übernehmen, auf das zerlegte Array möchte ich dann aber über die Instanz zugreifen können.
    Wie kann ich dieses Problem umgehen? Sollte ich generell den Aufbau überdenken?

    Vielen Dank schonmal im Voraus für die Hilfe.
    Cheers

    Dienstag, 6. November 2018 16:44

Alle Antworten

  • Hi,

    wo wirklich will sich mir nicht erschließen, was Du da fabrizieren möchtest.

    Erkannst hast Du ja schon, dass Du nicht auf etwas zugreifen kannst, wenn es das noch gar nicht gibt.

    Willst Du einfach einen String von außen an die Instanz übergeben und an anderer Stelle ein Array bzw. eine List<String> wieder auslesen?

    Falls ja, wie sollen die Zugriffe sein?

    Setzen des Strings nur im Konstruktor oder auch noch zu einem späteren Zeitpunkt?

    Array bzw. List<T> öffentlich über die Instanz auch für anderen Code lesbar?

    ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 6. November 2018 18:06
    Moderator
  • Hi,
    die Deklaration von Fields (klassenweit gültige Variablen) in einem Objekt incl. eventueller dort vorhandener Zuweisungen wird vor der Ausführung des Konstruktors abgearbeitet. Deshalb stehen da noch kein Inhalte zur Verfügung, die erst der Konstruktor bereitstellt. Abhilfe bringt eine andere Abfolge der Zuweisung, z.B. so:

        class Path
        {
          public Path(string path_org)
          {
            path = path_org;
            path_elements = SplitPath(path);
          }
          static private string path;
          public string[] path_elements;
          static private string[] SplitPath(string p)
          {
            string[] path_el;
            path_el = p.Split('\\');
            return path_el;
          }
        }


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Dienstag, 6. November 2018 18:54
  • Vielen Dank, habe es gestern abend noch auf diese Weise gelöst.
    Mittwoch, 7. November 2018 08:34