Статические конструкторы и методы расширения

Вопрос:

Интересно, если мой статический конструктор терпит неудачу и выдает исключение, если методы расширения все равно будут работать? Регистратор предназначен для обнаружения проблем в методах расширения. Если они не будут работать, мне придется попытаться поймать и убедиться, что конструктор преуспеет. Я бы предпочел, чтобы у меня было исключение, так как, надеюсь, вызов кода может зарегистрировать ошибку. (Это всего лишь пример кода, аналогичный тому, о чем я думаю)

     public static class Extensions
{

private static readonly log4net.ILog log;
private const TIME_TO_CHECK;

static Extensions()
{
log = log4net.LogManager.GetLogger           (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  //could maybe throw exception

TIME_TO_CHECK = readInFromFile();  //could maybe           throw                           exception            }

public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) {
int diff = dt.DayOfWeek - startOfWeek;
if (diff < 0) {
diff += 7;
}
return dt.AddDays(-1 * diff).Date;
}
}

Я действительно искал (надеюсь, это не повторение) и обнаружил, что исключение из статического конструктора исключений обычно не является хорошим. В большинстве случаев я считаю, что классы были теми, которые могли быть созданы, и были не только всеми методами расширения.

Лучший ответ:

Интересно, если мой статический конструктор терпит неудачу и выдает исключение, если методы расширения все равно будут работать?

Нет. Если инициализатор типа любого типа (независимо от того, использует ли он статический конструктор или нет), тип в основном неприменим после этого.

Это очень легко продемонстрировать это…

using System;

static class Extensions
{
    static Extensions()
    {
        Console.WriteLine("Throwing exception");
        throw new Exception("Bang");
    }

    public static void Woot(this int x)
    {
        Console.WriteLine("Woot!");
    }
}

class Test
{

    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            try
            {
                i.Woot();
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught exception: {0}", e.Message);
            }
        }
    }
}

Вывод:

Throwing exception
Caught exception: The type initializer for 'Extensions' threw an exception.
Caught exception: The type initializer for 'Extensions' threw an exception.
Caught exception: The type initializer for 'Extensions' threw an exception.
Caught exception: The type initializer for 'Extensions' threw an exception.
Caught exception: The type initializer for 'Extensions' threw an exception.

Оцените статью
TechArks.Ru
Добавить комментарий