【发布时间】:2011-06-11 21:26:10
【问题描述】:
我已经在 SO 中寻找答案,到目前为止我能找到的最好的答案是 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 样式。谢谢。
【问题讨论】:
-
应该会失败,但是自己试一下有什么问题?
-
我认为从(静态)构造函数中抛出真的没有意义,因为那时该类处于不稳定状态(未完全初始化)。在使用之前创建一个显式的
Init()函数怎么样(如果已经初始化,它应该什么都不做),如果它抛出异常,不要使用类 -
Pontus> 我认为 Jon 可能需要更多积分:)
-
Cameron> 我从来都不是 Init() 方法的忠实拥护者……如果需要 Init() 才能使类可用,为什么不在构造函数中执行呢?否则,您会将对象的控制权传递给调用者,并且您仍然必须测试被调用方法的有效性,因为您不能相信调用者做了他应该做的事情。我喜欢下面 Chris 的回答,这听起来像是你的方法和我的方法之间的妥协......在构造函数中设置配置,但不要抛出异常,而是检查静态方法中的设置。
-
感谢您的 PS。终于知道缩进样式有名字了!
标签: c# exception constructor static-classes