C#中的类初始化()?

C#中的类初始化()?,c#,C#,在Obj-c中,有静态的Initialize方法,该方法在第一次使用该类时被调用,无论是静态的还是通过实例调用的。类似于C#?中的任何内容都有一个静态构造函数。根据: 静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它。 公开课Foo { 静态Foo(){}//静态构造函数 }您可以使用与普通构造函数相同的语法编写静态构造函数,除了使用static修饰符(以及无访问修饰符): 通常您不需要这样做,但是-静态构造函数用于初始化,通

在Obj-c中,有静态的
Initialize
方法,该方法在第一次使用该类时被调用,无论是静态的还是通过实例调用的。类似于C#?

中的任何内容都有一个
静态构造函数。根据:

静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它。

公开课Foo { 静态Foo(){}//静态构造函数 }您可以使用与普通构造函数相同的语法编写静态构造函数,除了使用
static
修饰符(以及无访问修饰符):

通常您不需要这样做,但是-静态构造函数用于初始化,通常只在静态字段初始值设定项中执行即可:

public class Foo {
    private static readonly SomeType SomeField = ...;
}
如果您使用静态构造函数不仅仅是初始化静态字段,这通常是一种设计味道——但并不总是如此

请注意,静态构造函数的存在,要求它在第一次使用之前执行-无论是在第一个静态成员访问时,还是在创建第一个实例之前,以先发生的为准。

是的,它被称为静态构造函数

由MSDN提供:

public class Taxi
{
    public bool isInitialized;

    //This is the normal constructor, which is invoked upon creation.
    public Taxi()
    {
        //All the code in here will be called whenever a new class
        //is created.
        isInitialized = true;
    }

   //This is the static constructor, which is invoked before initializing any Taxi class
   static Taxi()
   {
       Console.WriteLine("Invoked static constructor");
   } 
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi(); //Create a new Taxi, therefore call the normal constructor
        Console.WriteLine(t.isInitialized); 
    }
}

//Output:
//Invoked static constructor
//true

出于兴趣,这是一个真正的一次性初始化,还是像Java一样“每个类加载器一次”。顺便说一句,戴帽子看起来不错。@Bathsheba:每个AppDomain一次,有点像类加载器,但不完全是:)只是出于好奇;OP要求“第一次使用该类时调用的方法”,但根据MSDN,静态构造函数是“在创建第一个实例或引用任何静态成员之前自动调用以初始化该类”。我们不应该把他指向一个普通的构造函数,而不是一个静态的吗?@DionV.:不,绝对不是。注意问题中的“静态或通过实例”。静态构造函数是在第一次使用之前调用的-这听起来与OP想要的完全一样。“第一次使用该类时调用哪个,无论是静态的还是通过实例调用的”-如果您的
Taxi
类有一个我们调用的静态方法怎么办?不会调用任何构造函数。此外,每个实例调用一个构造函数,而每个类调用一次
Initialize
。@Jonsket Ok,有效点,但是我提到的是由实例部分调用,而您提到的是静态部分,根据MSDN,它不能直接调用。。然而,你在自己没有完整答案的情况下否决了我的问题。粗鲁!“不能直接呼叫”是什么意思?我的观点是,如果调用了静态成员或创建了实例,就会调用静态构造函数,就像OP所希望的那样。就我所见,我的答案正好满足OP的要求,而你的答案并不满足,或者直到你最近添加了静态构造函数部分才满足。我不清楚你的评论“在初始化任何出租车类之前”是什么意思。@JonSkeet我的意思是你不能明确地调用静态构造函数。我猜我误解了OP的问题,但我不打算删除我的答案,因为他可能会发现提供普通构造函数部分很有用。好吧,它并没有回答所问的问题-我怀疑这更可能让OP和其他稍后阅读本文的人感到困惑。在这种情况下,我个人会删除它,但当然这是你的选择。
public class Taxi
{
    public bool isInitialized;

    //This is the normal constructor, which is invoked upon creation.
    public Taxi()
    {
        //All the code in here will be called whenever a new class
        //is created.
        isInitialized = true;
    }

   //This is the static constructor, which is invoked before initializing any Taxi class
   static Taxi()
   {
       Console.WriteLine("Invoked static constructor");
   } 
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi(); //Create a new Taxi, therefore call the normal constructor
        Console.WriteLine(t.isInitialized); 
    }
}

//Output:
//Invoked static constructor
//true