14

クラスに静的関数があります。

非静的データ メンバーを使用しようとすると、次のコンパイル エラーが発生します。

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

なぜそのように振る舞うのですか?

4

6 に答える 6

20

非静的メンバーはインスタンスに属します。あなたが話しているクラスのどのインスタンスを何らかの形で解決しなければ意味がありません。静的コンテキストでは、インスタンスがありません。そのため、オブジェクト参照を明示的に言及しないと、非静的メンバーにアクセスできません。

実際、オブジェクト参照を明示的に指定することで、静的コンテキストで非静的メンバーにアクセスできます。

class HelloWorld {
   int i;
   public HelloWorld(int i) { this.i = i; }
   public static void Print(HelloWorld instance) {
      Console.WriteLine(instance.i);
   }
}

var test = new HelloWorld(1);
var test2 = new HelloWorld(2);
HelloWorld.Print(test);

メソッド内のインスタンスを明示的に参照せずに、Print2 ではなく 1 を出力する必要があることをどのように知るのでしょうか?

于 2010-02-17T18:19:20.417 に答える
5

インスタンス メソッドは、実行するためにその特定のインスタンスの状態に依存します。

あなたが説明するシナリオを持つこのクラスがあるとしましょう:

class Person
{
    static PrintName()
    {
        // Not legal, but let's say it is for now.
        Console.WriteLine(Name);
    }

    private Name { get; set; }
}

うまくいけば、問題は今明らかです。Name はインスタンスメンバーであるため、Name はインスタンスごとに異なる可能性があるため、クラスの実際のインスタンスが必要です。

このため、インスタンスにアタッチされていない静的メソッドは、使用するインスタンスを認識していませ。どちらを指定するかを明示する必要があります。

于 2010-02-17T18:18:44.810 に答える
2

静的メソッドは、クラスの非静的メンバー変数に直接アクセスできません。

結局のところ、静的メソッドは、クラスのインスタンスが存在しなくても呼び出すことができます。存在しないインスタンスのメンバー変数にどのようにアクセスしますか??

(もちろん、Mehrdad が指摘したように、クラスのインスタンスを静的メソッドに渡して、そのインスタンスのすべてにアクセスすることもできますが、それはあなたが話していることではありませんよね?)

于 2010-02-17T18:18:40.543 に答える
2

静的関数は静的メンバーのみを使用し、静的関数を呼び出すことができます。

前述のように、静的関数はクラス インスタンスに対して操作できますが、クラス インスタンスから操作することはできません(より説明的な言葉がないため)。例えば:

class MyClass
{
    public int x;
    public static int y;

    public static void TestFunc()
    {
        x = 5; // Invalid, because there is no 'this' context here
        y = 5; // Valid, because y is not associated with an object instance
    }

    public static void TestFunc2(MyClass instance)
    {
        instance.x = 5; // Valid
        instance.y = 5; // Invalid in C# (valid w/ a warning in VB.NET)
    }
}
于 2010-02-17T18:19:25.370 に答える
1

静的関数から非静的データにアクセスすることはできません。これは、クラスのインスタンス化されたオブジェクトがあるかどうかに関係なく、静的関数を呼び出すことができるためです。ただし、非静的データは、クラスの特定のオブジェクト (インスタンス化) に依存しています。静的関数を呼び出すときにインスタンス化されたオブジェクトがあることを確認できないため、静的関数から非静的データにアクセスすることは非論理的です (したがって許可されません)。

この質問は、SO でさまざまな形式/さまざまな言語で何度か尋ねられています。

于 2010-02-17T18:20:11.553 に答える
1

「非静的データ メンバー」の定義は、「インスタンス データ メンバー」になります。つまり、非静的メンバーは、クラスの作成されたインスタンスに属します。

静的メソッドは、クラスの特定のインスタンスのコンテキストでは実行されません。したがって、そのようなメソッドに非静的メンバーを使用するように要求すると、クラスの 0 個以上のインスタンスのどれからデータを取得しようとするかがわかりません。

于 2010-02-17T18:21:59.477 に答える