2016-11-23 3 views
0

На странице системы WebForms .aspx, главная страница имеет несколько свойств авто инициализируется, как таковойКогда C# Auto-Properties инициализируются?

public bool MyProp => bool.Parse(Service.Settings["YorN"]); 

профилированию загрузки страницы, я вижу, что между PreRender события и инициализации одного из свойств есть большой разрыв.

Где я могу найти, чтобы выяснить задержку? Что между ними?

ответ

6

Это не авто property. Это выражение тела.

Ваша реализация MyProp вычисляет bool.Parse(Service.Settings["YorN"]);каждый раз, когда свойство геттер называется. Таким образом, в вашем случае этот код запускается всякий раз, когда вызывается MyProp, и он запускает каждый времени, когда он называется.

Если вы использовали автоматическое свойство, которое будет

public bool MyProp {get;} = bool.Parse(Service.Settings["YorN"]); 

Тогда он будет работать после создания экземпляра, и как раз перед вызывается конструктор (когда другие Инициализаторы поле запуска). Обратите внимание, что, поскольку этот код работает в инициализаторе поля, он не может использовать неявную ссылку(), поэтому, если Service является переменной экземпляра, это не будет компилироваться.

+0

Разве не _после_ конструктор вызывается? – JNF

+0

@JNF: Это было бы до того, как конструктор * body * будет выполняться одновременно с другими инициализаторами поля. –

+0

@JNF Нет, инициализаторы полей запускаются перед конструктором. Создайте экземпляр этого класса, чтобы убедиться сами: 'public class Foo {int i = 5; public Foo() {Console.WriteLine (i); }} 'Если поле сначала инициализировано, оно напечатает' 5', если это не так, оно напечатает '0'. – Servy

0

Они не являются, свойства подобны методам в этом случае, когда они имеют тела выражений - их содержимое оценивается при попытке прочитать их.

Итак, каждый раз, когда что-то пытается прочитать значение MyProp, оно запускает это выражение.

Возможно, вы захотите сделать это как свойство только для чтения и установить его во время создания своего класса.

1

Технически это элемент с выраженным выражением, который вызывается только при попытке «получить» свойство. Так что это называется всякий раз, когда его спрашивают.

Это эквивалент:

public bool MyProp 
{ 
    get 
    { 
     return bool.Parse(Service.Settings["YorN"]); 
    } 
} 
Смежные вопросы