16

this静的メソッドでキーワードを使用できないのはなぜですか? なぜ C# でこの制約が定義されているのか疑問に思っています。この制約によって得られるメリットは何ですか?

[更新]: 実は、これはインタビューで受けた質問です。あなたのすべての回答に基づいて、「静的」と「これ」の使用法を知っています.2つを一緒に使用できない理由を少し知っていると思います. つまり、静的メソッドは状態を変更したり、型レベルで何かをしたりするために使用されますが、「this」を使用する必要がある場合は、状態を変更したり、インスタンス レベルで何かをしたいということです。型の状態変化とインスタンスの状態変化を区別するために、c# では静的メソッドで「this」を使用できません。私は正しいですか?

4

13 に答える 13

60

クラスのインスタンスを指しているためthis、静的メソッドにはインスタンスがありません。

thisキーワードは、クラスの現在のインスタンスを参照します。静的メンバー関数にはthisポインターがありません

静的メンバーの定義が

static修飾子を使用して、特定のオブジェクトではなく型自体に属する静的メンバーを宣言します。

そのため、指摘するものはthis何もありません。

于 2010-08-11T14:20:42.120 に答える
13

this現在のオブジェクトのインスタンスです。静的メソッドでは、現在のオブジェクトは存在しないため、this存在しません。これは実際には制約ではありませんが、メソッドがstaticであることの要点全体です。

于 2010-08-11T14:21:26.773 に答える
2

静的メソッドを使用すると、次のように記述できます。

MyClass.static_method();

これはオブジェクトインスタンスとは何の関係もありません(したがって、このキーワードは必要ありません)。

static_method()は機能し、そのジョブにオブジェクトインスタンスを必要としないためです。static_method()は、どのオブジェクトインスタンスを持っているかを知りませんが、すべてのオブジェクトインスタンスの動作を変更する可能性があります。

MyClass a = new MyClass();
MyClass b = new MyClass();
MyClass.static_method("PRINTER");
a.display(); //print something
b.display(); //print something
MyClass.static_method("MONITOR");
a.display(); //display something on monitor
b.display(); //display something on monitor

この場合、static_method()は、MyClassのすべてのオブジェクトインスタンスのdisplay()メソッドの動作を変更します。

于 2010-08-11T14:53:55.010 に答える
2

これはC#に限定されるものではなく、制約ではなく、論理的な状況であると確信しています。@Yuriyが正しく述べているように、これはクラスの現在のインスタンスを参照します。つまり、クラスをインスタンス化するためにnew(またはDI)を使用し(のインスタンスを作成しました)、そのインスタンスを参照するために内部的に何らかの方法が必要です。物体。クラスをインスタンス化せずに静的メソッドが呼び出されます。実際には、オブジェクトは作成されないため、これが1つであるプロパティにアクセスすることはできません。

于 2010-08-11T14:28:02.623 に答える
2

thisクラスの現在のインスタンスを参照するため、インスタンス メソッドでのみ使用できます。静的メソッドは、インスタンスがないクラス レベルで動作します。したがって、いいえthis

于 2010-08-11T14:21:29.113 に答える
2

thisオブジェクトの現在のインスタンスを参照します。静的メソッドは、クラスのメソッドです。これはインスタンス メソッドではないため、静的メソッド内でこれを使用しても意味がありません。

于 2010-08-11T14:21:30.947 に答える
1

キーワードthisは、オブジェクトのインスタンスを参照します。静的コンテキストでは、参照する特定のインスタンスはありません。

于 2010-08-11T14:21:03.913 に答える
0

別の、より文字通り、あなたの質問に答えてください:

'this'キーワードは、メソッドに非表示のパラメーターとして自動的に渡されるインスタンスへのポインター(参照)にアクセスするためのシンボルであるインスタンスメソッドでの使用との混同を避けるために、静的メソッドで使用することはできません。

そうでない場合は、静的メソッドで「this」というローカル変数を定義できますが、インスタンスメソッドで「this」キーワードが参照するインスタンスとは関係ありません。

以下は、2つの同等のメソッドの例です。1つは静的メソッドで、もう1つはインスタンスメソッドです。どちらのメソッド呼び出しも、同じことを実行するコードを実行するメソッドに単一のパラメーターを渡し(オブジェクトの文字列表現をコンソールに出力します)、戻ります。

public class Someclass {

  void SomeInstanceMethod() 
    { System.Console.WriteLine(this.ToString()); }

  void static SomeStaticMethod(Someclass _this) 
    { System.Console.WriteLine(_this.ToString()); }

  public void static Main()
    {
       Someclass instance = new Someclass();
       instance.SomeInstanceMethod();
       SomeStaticMethod(instance);
    }
}
于 2010-08-11T17:40:39.583 に答える
0

「this」はクラスのインスタンスを指します。Staticはインスタンス化せずに初期化されるため、staticメソッドは作成されていない「インスタンス」を参照できません。

于 2010-08-11T14:31:47.967 に答える
0

thisキーワードは、としてマークされたメソッドで使用できstaticます。この構文は、C# で拡張メソッドを定義するために使用されます。この機能は、2007 年にリリースされた C# 3.0 から利用可能です ( Wikipedia ) 。

通常の使用法でthisは、インスタンスを参照し、インスタンスstaticが存在しないことを示します (したがって、 はありませんthis)。それらを一緒に使用できないという事実 (拡張メソッドなどの特別な例外は別として)は、概念的に何が何であるかthisを理解することから自然に導かれます。static

于 2017-10-13T12:39:37.400 に答える
0

this変数またはメソッドの親オブジェクトを参照するために使用されます。メソッドで宣言するstaticと、クラスのオブジェクトをインスタンス化する必要なくメソッドを呼び出すことができます。したがって、this静的メソッドがどのオブジェクトにも関連付けられていないため、キーワードは許可されません。

于 2010-08-11T14:22:50.983 に答える
0

簡単な答えは次のとおりです。これは、静的スコープに存在しないクラスのインスタンスを指します。

ただし、オブジェクト指向プログラミング言語に進む前に、良い本/クラスを探して、基本的なオブジェクト指向の概念を理解するようにしてください。

于 2010-08-11T16:23:02.240 に答える
0

これが問題の解決に役立つかどうかはわかりませんが、次の 2 つのコード スニペットは同等であると考えています。

MyStaticClass.foo();

そして単純に

foo();

MyStaticClass 内から foo() を呼び出すと仮定すると、両方とも MyStaticClass クラスの foo() メソッドを呼び出します。

編集 - 静的クラスと非静的クラスの違いを覚える最も簡単な方法は、Java の Math クラスのようなものを考えることです。Math.abs(x); を呼び出すことができます。x の絶対値を取得する必要があり、Math オブジェクトをインスタンス化することは実際には意味がありません。これが、Math が静的クラスである理由です。

于 2010-08-11T16:23:24.963 に答える