gpt4 book ai didi

c# - 静态构造函数如何工作?

转载 作者:IT王子 更新时间:2023-10-29 03:38:51 26 4
gpt4 key购买 nike

namespace MyNameSpace
{
static class MyClass
{
static MyClass()
{
//Authentication process.. User needs to enter password
}

public static void MyMethod()
{
//Depends on successful completion of constructor
}
}

class Program
{
static void Main(string[] args)
{
MyClass.MyMethod();
}
}
}

这是我假设的顺序

  1. 静态构造函数开始
  2. 静态构造函数结束
  3. 主线开始
  4. MyMethod 的开始
  5. 主线结束

现在在任何情况下,如果 4 将在 2 之前开始,我就完蛋了。可能吗?

最佳答案

你在这里只问了一个问题,但还有十几个你应该问的问题,所以我会一一回答。

Here is the sequence which I assumed

  1. 类构造函数的开始(也称为 cctor)
  2. cctor 结束
  3. 主线开始
  4. MyMethod 的开始

Is this correct?

没有。正确的顺序是:

  1. 程序的 cctor 开始,如果有的话。没有。
  2. 程序的 cctor 结束,如果有的话。没有。
  3. 主线开始
  4. 开始 MyClass 的 cctor
  5. MyClass 的 cctor 结束
  6. MyClass.MyMethod 的开始

What if there is a static field initializer?

在某些情况下,允许 CLR 更改静态字段初始值设定项的运行顺序。有关详细信息,请参阅 Jon 关于该主题的页面:

The differences between static constructors and type initializers

Is it ever possible for a static method like MyMethod to be called before the cctor of that class completes?

是的。 如果 cctor 本身调用 MyMethod,那么显然 MyMethod 将在 cctor 完成之前被调用。

The cctor does not call MyMethod. Is it ever possible for a static method like MyMethod to be called before the cctor of MyClass completes?

是的。 如果 cctor 使用另一种类型,其 cctor 调用 MyMethod,则 MyMethod 将在 MyClass cctor 完成之前被调用。

No cctors call MyMethod, directly or indirectly! Now is it ever possible for a static method like MyMethod to be called before the cctor of MyClass completes?

没有。

Is that still true even if there are multiple threads involved?

是的。在可以在任何线程上调用静态方法之前,cctor 将在一个线程上完成。

Can the cctor be called more than once? Suppose two threads both cause the cctor to be run.

无论涉及多少个线程,cctor 都保证最多被调用一次。如果两个线程“同时”调用 MyMethod,那么它们就会竞争。其中之一输掉比赛并阻塞,直到 MyClass cctor 在获胜线程上完成。

The losing thread blocks until the cctor is done? Really?

真的。

So what if the cctor on the winning thread calls code that blocks on a lock previously taken by the losing thread?

然后你有一个经典的锁顺序反转条件。你的程序死锁了。永远。

That seems dangerous. How can I avoid the deadlock?

如果您这样做时感到疼痛,那么停止这样做永远不要做会阻塞 cctor 的事情。

Is it a good idea to rely upon cctor initialization semantics to enforce complex security requirements? And is it a good idea to have a cctor that does user interactions?

都不是好主意。我的建议是您应该找到一种不同的方法来确保满足您的方法的影响安全的先决条件。

关于c# - 静态构造函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com