每次静态调用都会启动一个新线程吗?
例如:
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();
}
}
上述调用是否会相互独立?如果是,那么它是否类似于线程?
答案 0 :(得分:10)
回复您对静态电话的疑问:
但我听到每个静态通话都是 彼此独立 没有实例,只有静态成员 参与其中。是这样吗? - Sri Kumar 36 分钟前
您可以认为您的类有一个“全局”实例,所有静态方法都由此实例保存。
在您的示例中,您可以通过调用ClassA myA = new ClassA()
来创建“用户”实例。同时,将有一个“全局”实例,它由运行时创建但对您来说是不可见的,静态方法驻留在此实例中。静态方法行为作为此“全局”实例中的实例方法。
令人惊讶的是,在C#中有一个静态构造函数,当运行时初始化'global'实例时将调用它。
您可以测试此代码:
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)
否则它们将在同一个线程上顺序运行
答案 2 :(得分:1)
没有。静态方法与任何其他方法一样,除非您在不同的线程中调用它们,它们将在您调用的相同线程中运行。
这实际上取决于你在哪里调用。静态方法本身不会创建任何线程并在其中运行。
答案 3 :(得分:0)
静态方法是一种没有任何与之关联的类的方法。这意味着调用静态方法不必经历任何间接,这与基于调用它的对象解析的虚方法不同。
所有方法都将在调用方法的线程上运行,无论是虚拟还是静态。如果希望方法在不同的线程上运行,请使用线程池或其他一些技术。
答案 4 :(得分:0)
还有一件事:
我听到每个静态呼叫都是彼此独立的
静态方法调用并不是真正独立的。
静态方法仍然可以访问同一类中的其他静态字段和属性,或者其他类的公开可见静态字段和属性,这些字段也是全局的,并在应用的生命周期内保留。
正如您所建议的那样,正在改变静态字段状态的静态方法不是“独立的”。您唯一可以肯定的是,它们总是在单个实例上调用(始终使用相同的私有数据)。