1

各静的呼び出しは新しいスレッドを開始しますか?

例:

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

上記の呼び出しは互いに独立して実行されますか? はいの場合、それはスレッディングに似たものですか?

4

5 に答える 5

10

静的呼び出しに関する疑問に答えてください:

しかし、インスタンスがなく、静的メンバーのみが関与しているため、各静的呼び出しは互いに独立していると聞きました。そうですか?– スリ・クマール 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

これとは別に、静的メソッドにはインスタンス メソッドとの違いはありません。

各静的メソッドの変数には独自のスコープがあり、メソッドごとに独立しています。

于 2009-10-27T07:55:44.163 に答える
1

いいえ、同じスレッドで順次実行されます

于 2009-10-27T07:16:20.147 に答える
1

いいえ。静的メソッドは、呼び出し元と同じスレッドで実行される別のスレッドで呼び出さない限り、他のメソッドと同じです。

それは本当にどこで呼び出すかによって異なります。静的メソッド自体はスレッドを作成せず、その中で実行されます。

于 2009-10-27T07:19:31.043 に答える
0

もう一つ:

各静的呼び出しは互いに独立していると聞きました

静的メソッド呼び出しは、実際には独立していません。

静的メソッドは、同じクラス内の他の静的フィールドとプロパティ、またはパブリックに表示される他のクラスの静的フィールドとプロパティに引き続きアクセスできます。これらもグローバルであり、アプリの有効期間中保持されます。

あなたが示唆したように、静的フィールドの状態を変更している静的メソッドは「独立」していません。確実に言える唯一のことは、それらが常に単一のインスタンスで呼び出されることです (常に同じプライベート データを使用します)。

于 2009-10-27T08:41:29.710 に答える
0

静的メソッドは、クラスが関連付けられていないメソッドです。これは、呼び出されたオブジェクトに基づいて解決される仮想メソッドとは異なり、静的メソッドの呼び出しが間接化を経る必要がないことを意味します。

すべてのメソッドは、仮想か静的かにかかわらず、呼び出し元のメソッドのスレッドで実行されます。メソッドを別のスレッドで実行する場合は、スレッド プールまたはその他の手法を使用します。

于 2009-10-27T08:12:36.490 に答える