質問
各静的呼び出しは新しいスレッドを開始しますか?
例:
class A
{
public static void displayName()
{
Console.WriteLine("myName");
}
public static void displayAge()
{
Console.WriteLine("myAge");
}
}
class B
{
public void Foo()
{
A.displayName();
A.displayAge();
}
}
上記の呼び出しは互いに独立して実行されますか?はいの場合、それはスレッドに似ていますか?
解決
静的呼び出しに関する疑問に答えます:
しかし、各静的呼び出しは 互いに独立しています インスタンスなし、静的メンバーのみ 関与しています。そうですか? –スリ・クマール36 数分前
クラスの「グローバル」インスタンスがあり、すべての静的メソッドがこのインスタンスによって保持されていると考えることができます。
例のように、 ClassA myA = new ClassA()
を呼び出して「ユーザー」インスタンスを作成できます。一方、ランタイムによって作成されますが、ユーザーには見えない「グローバル」インスタンスがあり、静的メソッドはこのインスタンスに存在します。この「グローバル」インスタンス内のインスタンスメソッドとしての静的メソッドの動作。
驚くべきことに、C#には静的コンストラクターがあり、ランタイムによって「グローバル」インスタンスが初期化されるときに呼び出されます。
このコードをテストできます:
class A
{
static A() {
Console.WriteLine("Creating the global instance of class A....");
}
public static void displayName()
{
Console.WriteLine("myName");
}
public static void displayAge()
{
Console.WriteLine("myAge");
}
}
class B
{
public void Foo()
{
A.displayName();
A.displayAge();
}
}
出力は次のようになります。
Creating the global instance of class A....
myName
myAge
これとは別に、静的メソッドはインスタンスメソッドと何の違いもありません。
各静的メソッドの変数には独自のスコープがあり、1つのメソッドから別のメソッドに独立しています。
他のヒント
いいえ、同じスレッドで順番に実行されます
いいえ。静的メソッドは、別のスレッドで呼び出さない限り、他のメソッドと同様です。呼び出し元と同じスレッドで実行されます。
実際にどこで呼び出すかによって異なります。静的メソッド自体はスレッドを作成せず、内部で実行されます。
静的メソッドは、クラスが関連付けられていないメソッドです。つまり、静的メソッドの呼び出しは、呼び出されるオブジェクトに基づいて解決される仮想メソッドとは異なり、インダイレクションを経由する必要はありません。
すべてのメソッドは、仮想メソッドでも静的メソッドでも、呼び出しメソッドのスレッドで実行されます。メソッドを別のスレッドで実行する場合は、スレッドプールまたはその他の手法を使用します。
もう1つ:
各静的呼び出しは互いに独立していると聞きました
静的メソッド呼び出しは実際には独立していません。
静的メソッドは、同じクラス内の他の静的フィールドとプロパティ、または公開されている他のクラスの静的フィールドとプロパティにアクセスできます。これらはグローバルであり、アプリの有効期間中も保持されます。
静的フィールドの状態を変更する静的メソッドは、あなたが提案したように「独立」ではありません。あなたが言うことができる唯一のことは、それらが常に単一インスタンスで呼び出されることを確実にすることです(常に同じプライベートデータを使用します)。