web-dev-qa-db-ja.com

非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です

私は以前にこの質問について人々が質問したことがあるのを知っていますが、シナリオはあまりに具体的であり、私は基本について混乱しています。

C#プログラムには2つの基本バージョンがあり、1つは機能し、もう1つは機能しません。 2番目のプログラムでエラーが発生した理由を誰かが説明してもらえれば幸いです非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です

作品:

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)
                ;
        }
    }
}

動作しません:

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)
                ;
        }
    }
}

2番目のプログラムでPrint()Test()クラスのテキストを実行しようとすると、エラーが発生しますオブジェクト参照が非静的フィールド、メソッド、またはプロパティ、そしてその理由がわかりません。 Test()クラスのインスタンスを宣言する場所に関係していることがわかりますが、C++でこのようなことが起こっていることを覚えていないので、私は不思議に思います。

どうしたの?

3
Simflare

これはクラスの定義によるものではなく、キーワード static の使用法がすべてです。

クラスnewTestTestオブジェクトは、クラスProgramのパブリックメンバーであり、mainはプログラムクラス内の静的関数です。エラーメッセージ_An object reference is required for the non-static method_に明確に記載されています。したがって、mainなどの静的メソッドでアクセスするために、newTestオブジェクトを静的として宣言する必要があります。

このような

_ public static Test newTest = new Test();
_

追記

次のように、クラスPrint内でメソッドstaticTestとして定義するとします。

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

次に、現在使用している方法(newTest.Print();)のようにメソッドを呼び出すことはできません。代わりにTest.Print();を使用する必要があります。静的メンバーはインスタンスから参照できません。代わりに、型名を通じて参照されます。たとえば、次のクラスを検討してください

4

最初のプログラムでは、staticメソッド内に新しいインスタンスを作成しました。このメソッド内では、何をしてもかまいません。

ただし、一部のメソッドを呼び出したり、静的メソッドの外部で一部の変数にアクセスしたりする場合は、それらを静的にする必要があります。理由は、静的メソッドを呼び出すと、クラスのインスタンスが作成されないため、非静的変数のインスタンスがまだ作成されず、それらにアクセスできないためです。

したがって、2番目のプログラムでは、newTest変数の開始行は、_Programクラスの外にProgram p = new Program();のようなコード行があるまで実行されません。解決策は、変数Print()メソッドの外で変数にアクセスできるように変数を静的にするか、またはMin()メソッドを非静的に変換することですMain()メソッドでは例外的に不可能なモード。

グローバル変数を定義する場合は、特別なクラスe.xを定義することをお勧めします。 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