Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用静态构造函数(Jon Skeet Braintaster)_C#_Clr_Static Constructor - Fatal编程技术网

C# 使用静态构造函数(Jon Skeet Braintaster)

C# 使用静态构造函数(Jon Skeet Braintaster),c#,clr,static-constructor,C#,Clr,Static Constructor,作为一个相对的新手,我试着尽可能多地阅读某个特定主题,并尽可能多地测试/编写代码。我在看(问题2)中的一个,结果与答案不同。这让我想问一下在最近的版本中是否有什么变化,看看其他人从这段代码中得到了什么输出 问题是,“展示什么,为什么,你有多自信?” 什么,如果有的话,会导致我们得到两个不同的答案呢?乔恩自己也讨论了这一点。我不是一个C#guy,但系统似乎只有一个选择,即何时调用静态foo代码(并因此编写“foo”),但它基本上有无限的自由来决定何时初始化Bar.I(将编写“Bar”),因此它可以

作为一个相对的新手,我试着尽可能多地阅读某个特定主题,并尽可能多地测试/编写代码。我在看(问题2)中的一个,结果与答案不同。这让我想问一下在最近的版本中是否有什么变化,看看其他人从这段代码中得到了什么输出

问题是,“展示什么,为什么,你有多自信?”


什么,如果有的话,会导致我们得到两个不同的答案呢?

乔恩自己也讨论了这一点。我不是一个C#guy,但系统似乎只有一个选择,即何时调用静态
foo
代码(并因此编写“foo”),但它基本上有无限的自由来决定何时初始化
Bar.I
(将编写“Bar”),因此它可以在加载类时或首次使用时发生,或者根本没有。

只要看看它,如果它显示除“FooBar”之外的任何内容,我都会感到惊讶

原因很简单,您首先访问Foo,因此它的静态构造函数将运行。实例化Bar时,后跟静态字段初始值设定项


很高兴被更正。

现在在发布模式下,在调试器之外尝试它-p


有/没有调试器,我会得到不同的结果。调试器扰乱了许多微妙的细微差别/优化,因此我只能猜测这是调试器最重要的时刻之一。这使得调试更加困难-p

它在调试模式下打印Foo,Bar,在发布模式下打印Bar,Foo。因此,所发生的事情是发布代码被优化,优化导致首先调用Bar-但不能保证总是这样。

我认为foo-Bar会被打印出来。静态类型构造函数将首先在Foo中执行,然后在Bar类上调用Init方法。我不知道这种行为是否会改变。这很有趣。

您在问“Visual Studio的最新版本是否发生了变化”。您真正要问的是,在较新版本的.NET Framework中是否有任何更改。而且,实际上,major不会在不同版本之间进行任何更改,因为这将是一个重大的突破性更改。重复。有意思。那么,你得到了什么答案?今天早些时候我在Jon的网站上读到了这个@jprete是正确的,这是因为Foo类中的静态构造函数。这正是我所缺少的。我在发布模式下得到'Foo',在调试模式下得到'Foo'和'Bar'。从原始编程语言的角度来看,“Foo”和“Bar”不应该按顺序显示吗?为什么优化会导致首先调用Bar。这里的规则是什么?我必须检查一下,但如果是调试器,而不是调试/发布,我不会感到惊讶。由于bar没有静态构造函数,它可以为i初始化值,并提前准备好bar类。这样可以防止以后发生更多的工作。或者,调试器允许稍后初始化Bar。Foo,因为它有构造函数,在第一次创建时总是会被初始化,而Bar可以随时被初始化。@Marc-我在IDE之外运行了这两个函数来获得这些结果,所以我不认为调试器是这里的因素。
using System;

class Foo
{
    static Foo()
    {
        Console.WriteLine ("Foo");
    }
}

class Bar
{
    static int i = Init();

    static int Init()
    {
        Console.WriteLine("Bar");
        return 0;
    }
}

class Test
{
    static void Main()
    {
        Foo f = new Foo();
        Bar b = new Bar();
    }
}