C# Zugriffsmodifizierer richtig, oder: warum kein Zugriff auf Objektfelder ?

User7634

Cadet 4th Year
Registriert
Aug. 2012
Beiträge
109
Hallo,
ich bin noch relativ neu bei C# unterwegs und stoße auf ein Problem des Zugriffs auf Objektfelder. Mein Code ist folgender:

Code:
public class EinfacheKlasse
    {
        // Deklaration Felder:
        string firstTry;
        Word.Application oWord = null;
        Word.Documents oDocs = null;
        Word.Document oDoc = null;
        object _missing = Type.Missing;

        public EinfacheKlasse()  //Konstruktor
        {
            Word.Application oWord = new Word.Application();
            Word.Document oDoc = oWord.Documents.Add(ref _missing, ref _missing, ref _missing, ref _missing);
            //Testweise Ausgabe auf Konsole:
            Console.WriteLine(oWord.GetType().ToString());  // Ausgabe "...Interop.Word.ApplicationClass"
            Console.WriteLine(oDoc.GetType().ToString());   //Ausgabe "...Interop.Word.DocumentClass"
             Console.WriteLine(firstTry.GetType()); // Fehler "NullReferenceException"
            Console.WriteLine(oDocs.GetType());   // Fehler "NullReferenceException"
        }

Den Konstruktor rufe ich auf mit:
Code:
EinfacheKlasse EF = new EinfacheKlasse();
Wenn ich im Konstruktor versuche, mit getType() den Typ der Felder auf der Konsole auszugeben, erhalte ich bei den Feldern 'firstTry' und 'oDocs' den Fehler: „NullReferenceException wurde nicht behandelt“. Ich verstehe das nicht, die Felder sind doch deklariert. Muss ich sie erst initialisieren, um den Typ zu erfahren ? Warum ist das so ?

VG
User7634
 
Einerseits geht ein Zugriff auf einen Member oder Methode eines Objektes das null ist immer schief. Das trifft auch auf GetType() zu. Andererseits wie soll GetType den Typ des Objektes ermitteln wenn es gar kein Objekt gibt? Aufgrund von Vererbung und Interfaces kann das ja von der Deklaration der Variablen abweichen.
 
Warum deklarierst du zwei Objekte (Z5 und Z12) mit dem selben Namen?!
 
User7634 schrieb:
Muss ich sie erst initialisieren, um den Typ zu erfahren ?
Ja, musst du.

User7634 schrieb:
Warum ist das so ?
Auf technischer Ebene: GetType() ist eine ganz normale Methode. Methoden kannst du nur auf Objekten aufrufen. firstTry und oDocs sind bei dir aber null, d. h. es gibt kein Objekt das die Methode ausführen kann.

Wenn man weiterdenkt, ist es auch logisch nicht möglich den Typ einer Variable die null ist herauszufinden. Stichwort: Polymorphie.
Code:
abstract class Fahrzeug { }
class Auto : Fahrzeug { }
class Fahrrad: Fahrzeug { }

class Test
{
    Fahrzeug einFahrzeug = null;

    void Foo()
    {
        // War erwartest du hier?
        // Hinter "einFahrzeug" könnte sich sowohl ein Objekt vom Typ "Auto" als auch vom Typ "Fahrrad" verbergen.
        // Da "einFahrzeug" aber null ist, weißt du es nicht.
        Console.WriteLine(einFahrzeug.GetType()
    }
}
 
hier stand Mist
 
Zuletzt bearbeitet:
SheldonCooper schrieb:
Ignorier alles was die anderen geschrieben haben. Korrigiere die Fehler in Z12 und 13:
oWord und oDoc sind in Ordnung (der Typ wird laut TE schon korrekt ausgegeben!), weil lokalen (initialisierten) Variablen die gleichnamigen Klassenmember verdecken. Vermutlich nicht gewollt, deshalb ist der Hinweis darauf schon berechtigt.

Das ist aber nicht sein Problem. Sein Problem sind firstTry und oDocs, die tatsächlich null sind, was der TE auch schon erkannt hat.
 
Nö, warum sollte ich das ignorieren ? Scheint mir sehr klug zu sein, was Ihr alle da geschrieben habt. Insbesondere die Erklärung von TheCadillacMan hat mich weitergebracht. Aber Dank an alle, die geantwortet haben.

Die Fehler in Z12 und Z13 habe ich korrigiert. Aber die betreffen natürlich nicht die Felder 'firstTry' und 'oDocs'
 
Zurück
Oben