2016-07-18 2 views
0

я следующий статический класс со статическим полем:Определение поля в статическом классе

public static class IncludeExtender { 

    private static readonly MethodInfo _include = typeof(EntityFrameworkQueryableExtensions).GetTypeInfo(); 

} 

Есть ли разница между предыдущим примером и следующий один, где значение поля определяются в конструкторе класса?

public static class IncludeExtender { 

    private static readonly MethodInfo _include; 

    static IncludeExtender() { 
    _include = typeof(EntityFrameworkQueryableExtensions).GetTypeInfo(); 
    } 

} 

Какой был бы лучший вариант для этого?

+0

Нет, это то же самое – Mangist

+0

То же, что и в 'terms', какое определенное определение? – Jay

+0

Любые советы, по какому подходу вы использовали бы? –

ответ

1

Нет, они идентичны. readonly -modifier утверждает, что значение членов может быть изменено только во время объектной инициализации. Это либо непосредственно внутри класса-тела, либо в конструкторе.

Однако, инициализируя переменную внутри конструктора, вы можете добавить дополнительную логику спереди, которая влияет на значение, например, вы можете изменить значение в зависимости от определенного условия. См. Это:

static IncludeExtender() { 
    var a = "Test"; 
    _include = a.GetType().GetTypeInfo(); 
    } 
+4

Не совсем верно. Если конструктор не запускается, то прежний пример не будет выполняться, когда последний выполняется до того, как конструктор когда-либо запускается. – Jay

+0

@Jay Статический конструктор будет определенно запущен, если вы каким-либо образом ссылаетесь на класс. Таким образом, оба будут производить то же самое. – HimBromBeere

+0

Подумайте об этом ... если вы OOM, как это будет работать? Более того, член, который был выделен снаружи, может или не может быть выделен. – Jay

-2

Нет, ОНИ НЕ ИДЕНТИЧНЫ.

Один пример определяет статический член типа.

Другой определяет конструктор внутри статического типа, который выделяет элемент, который также является статическим.

Если ваш конструктор не работает или имеет исключение, то присваивание не произойдет, поскольку прежний пример не страдает от одной и той же точной семантики.

Это еще не все, о чем вы должны думать, I.e. если конструктор находится в MIDDLE запуска, а поток прерывается или прерывается или иначе, то что, по вашему мнению, произойдет?

+0

Итак, что вы будете использовать с учетом информации о методе, всегда будет одинаковой и будет использоваться в других методах класса? –

+0

Но разве конструктор не будет работать? У меня есть только этот и является статическим классом. –

+0

Это зависит от сценария, и ваш вопрос, честно говоря, НЕ передает истинный базовый вопрос, это о семантике кода или сущности в коде ...? !!? – Jay

Смежные вопросы