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

回复您对静态调用的疑问:

但我听说每个静态调用都是相互独立的,因为没有实例,只涉及静态成员。是这样吗?– Sri Kumar 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:12:36.490 回答
0

还有一件事:

我听说每个静态调用都是相互独立的

静态方法调用并不是真正独立的。

静态方法仍然可以访问同一个类中的其他静态字段和属性,或者其他类的公开可见的静态字段和属性,它们也是全局的,并且在您的应用程序的生命周期内保留。

正如您所建议的,正在改变静态字段状态的静态方法不是“独立的”。唯一可以肯定的是它们总是在单个实例上调用(总是使用相同的私有数据)。

于 2009-10-27T08:41:29.710 回答