vacio propiedad predeterminado polimorfico metodo herencia heredada constructores clase automatico c# exception constructor static-classes

c# - propiedad - Excepción en constructor estático



Busqué alrededor de SO para obtener una respuesta a esto, y el mejor que puedo encontrar hasta ahora está aquí , sin embargo, está orientado a instancias con constructores estáticos; Solo estoy usando la clase estáticamente.

Mi código:

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); .

Entonces, si el constructor estático lanza una excepción la primera vez que se invoca, ¿qué ocurre la segunda vez que intento acceder al método estático SendMail ()?

PD: Disculpa si no te gusta la versión Stroustrup del estilo de corsé K & R, pero no edites mi publicación solo para cambiar los tirantes a tu estilo Allman preferido. Gracias.


Las otras dos respuestas son buenas respuestas a su pregunta directa - aquí hay una meta respuesta - usted debe arrojar la excepción en el método cuando detecta que los elementos de configuración no están poblados, en lugar de en el constructor. En mi humilde opinión, "no configurado" es un estado de configuración válido para esos elementos en la fase de constructor, simplemente no en la hora SendMail. Eso soslayará todo este problema.


Una vez que un inicializador de tipo ha fallado una vez, nunca se vuelve a intentar. El tipo está muerto durante toda la vida del AppDomain. (Tenga en cuenta que esto es cierto para todos los inicializadores de tipo, no solo para los tipos con constructores estáticos. Un tipo con variables estáticas con expresiones de inicializador, pero no con constructores estáticos, puede presentar sutiles diferencias en el tiempo de ejecución del inicializador de tipo, pero sí todavía solo sucede una vez).

Demostración:

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); } } } }

Salida:

In static constructor TypeInitializationException TypeInitializationException TypeInitializationException TypeInitializationException TypeInitializationException

Como puede ver, el constructor estático solo se llama una vez.