我已经四处寻找答案,到目前为止我能找到的最好的答案是 here ,但是这是针对具有静态构造函数的实例;我只是静态地使用这个类。
我的代码:
public static class MailHelper {
private static string mailHost;
static MailHelper() {
var mailSettings = ConfigurationManager.GetSection("MailSettings") as NameValueCollection;
if (null == mailSettings) {
throw new ConfigurationErrorsException("Missing Mail Settings in the configuration file");
}
mailHost = ConfigurationManager.AppSettings["mailHost"];
if (null == mailHost) {
throw new ConfigurationErrorsException("Missing mailHost setting in the configuration file");
}
}
public static void SendMail(MailMessage Message) {
...
}
}
try {
MailHelper.SendMail(Message);
}
catch (ConfigurationErrorsException exc) {
...
}
// ???
MailHelper.SendMail(Message);
.
因此,如果静态构造函数在第一次调用时抛出异常,那么当我第二次尝试访问静态 SendMail() 方法时会发生什么?
PS:很抱歉,如果您不喜欢 Stroustrup 版本的 K&R 牙套样式,但不要只是为了将牙套更改为您喜欢的 Allman 样式而编辑我的帖子。谢谢。
最佳答案
一旦类型初始值设定项失败一次,就永远不会重试。该类型在 AppDomain 的生命周期内是死的。 (请注意,这适用于所有类型初始化器,而不仅仅是具有静态构造函数的类型。具有带有初始化器表达式的静态变量但没有静态构造器的类型可能会在类型初始化器执行的时间上表现出细微的差异 - 但它会仍然只发生一次。)
演示:
using System;
public sealed class Bang
{
static Bang()
{
Console.WriteLine("In static constructor");
throw new Exception("Bang!");
}
public static void Foo() {}
}
class Test
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
try
{
Bang.Foo();
}
catch (Exception e)
{
Console.WriteLine(e.GetType().Name);
}
}
}
}
输出:
In static constructor
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
如您所见,静态构造函数只被调用一次。
关于c# - 静态构造函数中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4737875/