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