it-swarm.com.de

Für das nicht statische Feld, die Methode oder die Eigenschaft ist eine Objektreferenz erforderlich

Ich weiß, dass die Leute schon früher nach dieser Frage gefragt haben, aber das Szenario war zu konkret und ich bin verwirrt über die Grundlagen.

Ich habe zwei grundlegende Versionen eines C # -Programms, eine, die funktioniert, und eine, die nicht funktioniert. Ich würde es lieben, wenn jemand erklären könnte, warum ich den Fehler bekomme. Für das nicht statische Feld, die Methode oder die Eigenschaft im zweiten Programm ist eine Objektreferenz erforderlich.

Werke:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test newTest = new Test();
            newTest.Print();
            while (true)
                ;
        }
    }
}

Funktioniert nicht:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        public Test newTest = new Test();

        static void Main(string[] args)
        {
            newTest.Print();
            while (true)
                ;
        }
    }
}

Wenn ich versuche, Print () den Text aus der Klasse Test () im zweiten Programm zu verwenden, wird mir der Fehler angezeigt. _/Für das nicht statische Feld, die Methode oder die Eigenschaft, und ich verstehe nicht warum. Ich kann sehen, dass es damit zu tun hat, wo ich eine Instanz der Test () -Klasse deklariere, aber ich erinnere mich nicht, dass sich so etwas in C++ ereignet, so dass es mich verwirrt. 

Was ist los?

3
Simflare

Dies liegt nicht an der Definition der Klasse, sondern an der Verwendung des Schlüsselworts static .

Das newTest-Objekt der Klasse Test ist ein öffentlicher Member der Klasse Program und die main ist eine statische Funktion innerhalb der Programmklasse. und es wird in der Fehlermeldung An object reference is required for the non-static method ausdrücklich erwähnt. Sie brauchen also das Objekt newTest als statisch deklarieren, um mit statischen Methoden wie main darauf zugreifen zu können.

so was

 public static Test newTest = new Test();

Ein zusätzlicher Hinweis

Beachten Sie, dass Sie die Methode Print als static innerhalb der Klasse Test wie folgt definieren:

 public static void Print()
 {
    Console.Write(myTest);
 }

Dann können Sie die Methode nicht so aufrufen, wie Sie sie gerade verwenden (newTest.Print();). Anstelle dessen müssen Sie Test.Print();, Since verwenden. Ein statischer Member kann nicht durch eine Instanz referenziert werden. Stattdessen wird über den Typnamen referenziert. Betrachten Sie zum Beispiel die folgende Klasse

4

Im ersten Programm haben Sie eine neue Instanz innerhalb einer statischen Methode erstellt. Innerhalb dieser Methode können Sie alles tun.

Wenn Sie jedoch einige Methoden aufrufen oder auf Variablen außerhalb statischer Methoden zugreifen möchten, müssen diese statisch sein. Der Grund ist, wenn Sie eine statische Methode aufrufen, keine Instanz einer Klasse erstellt wird und folglich keine Instanz von nicht statischen Variablen erstellt wird und Sie keinen Zugriff darauf haben!

Im zweiten Programm wird also die newTest -Variableninitiierungszeile nicht ausgeführt, bis Sie eine Codezeile außerhalb von Program-Klasse wie Program p = new Program(); haben. Die Lösung ist, Sie machen die Variable statisch, um außerhalb der statischen Methode Print () zugreifen zu können. Oder Sie können Ihre Methode Min () in einen nicht statischen Modus konvertieren ist ausnahmsweise für die Methode Main () unmöglich.

Wenn Sie eine globale Variable definieren möchten, empfehle ich Ihnen, eine spezielle Klasse e.x zu definieren. MyGlobals:

public class SomeClass
{
    public int x;
}

public class MyGlobals
{
    public static SomeClass mySharedVariable = new SomeClass();

    public SomeClass myGlobalVariable = null;
}

// Usage:
class Program
{
    static void Main(string[] args)
    {
        MyGlobals.mySharedVariable.x = 10; // Shared among all instances
        MyGlobals myGlobal = new MyGlobals(); // New instance of MyGlobals
        myGlobal.myGlobalVariable = new SomeClass(); // New instance of SomeClass
        myGlobal.myGlobalVariable.x = 10; // One instance of MyGlobals including one instance of SomeClass
    }
}
0
Amin