3

静的変数を使用すると、その値がすべてのユーザーで共有されることを知っています。

static string testValue = "";
protected void SomeMethod(object sender, EventArgs e)
{
    testValue = TextBox1.Text;        
    string value = TestClass.returnString(TextBox1.Text); // <-- return from a static method
}

したがって、この場合、あるユーザーが Web サイトにアクセスしてテキストボックスに値をtestValue入力すると、別のユーザーがテキストボックスに何かを入力すると、文字列は別の値で上書きされます。(おもう?)

私は今このクラスを持っています:

public class TestClass
{
  public static string returnString(string msg)
  {
    return msg;
  }
}

私の質問は、静的メソッドを使用する場合、そのメソッドの戻り値もすべてのユーザーで共有されますか? または、それは常にユーザーごとの「一意の」値ですか?

このメソッドが 5 人の異なるユーザーによって 5 回呼び出されたとします。この静的メソッドは、特定のユーザーが入力した値を返しますか?それとも、あるユーザーが別のユーザーが入力した値を取得する可能性はありますか?

4

8 に答える 8

5

あなたの質問は:

私の質問は、静的メソッドを使用する場合、そのメソッドの戻り値もすべてのユーザーで共有されますか? または、それは常にユーザーごとの「一意の」値ですか?

そして答えは、場合によります。あなたの例を使用して:

public class TestClass 
{ 
  public static string returnString(string msg) 
  { 
    return msg; 
  } 
}

この場合、5 人の異なるユーザーが (おそらく) 5 つの異なる文字列を静的メソッドに渡します。したがって、5 つの異なる文字列が返されます。したがって、この場合:

string value = TestClass.returnString(TextBox1.Text);

各ユーザーは、自分の TextBox に入力したものをすべて返します。一方、コードが次の場合:

string value = TestClass.returnString(testValue);

それらはすべて、返された時点で静的文字列にあったものを返します。

したがって、覚えておくべきルールは次のとおりです。

  • メソッドが静的メンバー変数を使用する場合、異なるユーザーが互いの結果に影響を与えるリスクがあります。これは、メソッドが静的であるかどうかに関係なく当てはまります。
  • メソッドが呼び出しパラメーターとローカル変数のみを使用し、呼び出しパラメーター自体が統計メンバー変数を指していない場合、異なるユーザーからの呼び出しは互いに影響しません。
于 2012-07-09T21:09:54.670 に答える
2

静的メソッドまたは変数は、クラス自体を通じて常に使用可能であり、このクラスのインスタンスにバインドされるだけではありません。

于 2012-07-09T20:57:24.357 に答える
2

私の質問は、静的メソッドを使用する場合、そのメソッドの戻り値はすべてのユーザーにも共有されるのでしょうか?それとも、それは常にユーザーごとの「一意の」値ですか?

静的変数は、アプリケーションドメイン内で共有されます。Webサーバーは、複数のインスタンスを並べて実行し、複数のユーザー間で共有している可能性があるため、信頼できません。

ユーザーごとに1つのインスタンス:ユーザーごとに一意の値を維持する場合は、セッション変数を使用します。

すべてのユーザーに1つのインスタンス:複数のユーザー間で真に単一の一意の変数インスタンスを共有することは簡単ではありません。データベースを使用して、すべてのユーザーが同じ値を取得するようにすることを検討してください。

于 2012-07-09T20:55:19.307 に答える
2

静的メソッドは、特定のオブジェクトにバインドされているのではなく、クラスにバインドされています。TestClassクラス内で宣言された静的関数を呼び出すためにのインスタンスは必要ありません。したがって、静的関数は、クラスの特定のインスタンスにバインドされているため、クラスの非静的メンバーを使用できません。

実際、これは静的変数でも同じです。静的変数は特定のオブジェクトではなく、クラスにバインドされます。1 つのオブジェクトが変数を変更すると、変数は一度だけ存在するため、すべてのオブジェクトで変更されます。

于 2012-07-09T20:53:28.380 に答える
1

静的メソッドが共有リソースを使用しない場合、複数の呼び出し元が同時にヒットしても問題はありません。メソッドがパラメーターとして「共有オブジェクト」を渡されない限り (各呼び出し元が渡されたパラメーターの独自のインスタンスを持っていることを意味します)、静的メソッド自体は共有リソース (変数/オブジェクトなど) を使用しません。 ..静的メソッドの外側にスコープが設定されている場合)、各呼び出し元が独自のスレッドでメソッドを実行するため、各呼び出し元がメソッドの独自のコピーを持っているかのようになります。

ただし、静的メソッドが共有オブジェクトまたはリソース (他の場所で定義された静的オブジェクトなど) を使用する場合、複数の呼び出し元が互いにステップする可能性があるため、これを処理するには静的メソッドで何らかのロックが必要になります。この場合、静的メソッドは、ヒットする複数のスレッドを処理する独自のロジックを追加しない限り、スレッドセーフではありません。

于 2012-07-09T21:03:49.130 に答える
0

私の知る限り、5つの異なる場所または5つの異なるコンピューターからサイトにログオンしている5人のユーザーは、この値は共有されません。1台のPCから1人のユーザーにのみ共有されます。

各ブラウザがアプリケーションの個別のコピーを実行していると想定できます。静的変数は、アプリケーション間ではなく、アプリケーション内で共有されます。

于 2012-07-09T20:57:57.163 に答える
0

引数として渡された変数を返すだけなので、質問は意味がありません。

各メソッド呼び出しは引数として別の変数を取り、その変数が返されるので、その変数をすべてのユーザー間でどのように共有できますか?

于 2012-07-09T20:58:34.077 に答える
0

静的変数に依存しないでください。ただし、HttpContext の objetc の例の単一インスタンスを取得する必要がある場合は、静的メソッドが一般的に使用されます。

于 2012-07-09T20:58:52.920 に答える