2012-04-13 4 views
0

Можете ли вы сказать мне разницу between..the следующий конструктор инициализаций ..Инициализация значений в конструкторе

Здесь Личность класса .. В том, что я пытаюсь инициализировать некоторые значения ... и я создал три свойства, названные

"Имя, Возраст, CanCode"

и вызова одного из этого ..

//Without Static 

public Class Person 
{ 

    Person[] people = { 
      new Person { Name="Allen Frances", Age=11, CanCode=false }, 
      new Person { Name="Burke Madison", Age=50, CanCode=true } 
    } 

    // with Static...  
    /* 
    static Person[] people = 
    { 
      new Person { Name="Allen Frances", Age=11, CanCode=false }, 
      new Person { Name="Burke Madison", Age=50, CanCode=true } 
    } 
    */ 
    ........... 
} 

Когда я пытаюсь инициализировать конструктор класса без ключевого слова static .. показывает «Исключение стека OverFlow».

, когда я отлаживаю код, здесь, когда после создания объекта для класса Person инициализация происходит больше времени, я не знаю почему?

, что я знаю, это, если вы используете ключевое слово static те мы инициализируем к представлению данных, конструктор до создания объекта ... но здесь, когда мы пытаемся инициализировать данные после создания объекта он показывает это поведение ..

Можете ли вы сказать мне, почему ...

+0

Перепишите вопрос с точными примерами кода (например, я не вижу 'out'keyword в коде). Кроме того, используйте кодовые блоки (отступы) только для кода, чтобы сделать вопрос понятным. –

ответ

4

вы получаете переполнение стека, потому что вы находитесь внутри определения класса под названием Person, и вы пытаетесь создать больше объектов того же класса внутри него. Когда эти объекты Person созданы, они также пытаются создать и другие объекты Person и т. Д.

Это рекурсивное определение ударяет стек, потому что оно бесконечно и никогда не заканчивается.

Попытка определения этого блока кода:

Person[] people = { 
       new Person { Name="Allen Frances", Age=11, CanCode=false }, 
        new Person { Name="Burke Madison", Age=50, CanCode=true } 
        } 

В другой части вашего кода, может быть основным методом?

+0

Стоит отметить, что семантика кода выдувания стека также неверна или нечетна в лучшем случае. Поле экземпляра в классе должно содержать некоторую информацию о экземпляре класса или ссылки на объекты, принадлежащие экземпляру или содержащиеся в нем. Человек обычно не содержит других людей! Так что тот факт, что этот код действительно не работает, не так хлопотно. Если OP хочет где-то содержать список людей, вероятно, это должно быть в классе «People» или «PersonRepository». – phoog

+0

Спасибо. Для ответа., Но это не показывает ошибку, когда я использую ключевое слово Static, почему ..? –

+0

Поскольку static означает, что оно связано с определением класса, а не с экземпляром. Так что эта строка будет запускаться только один раз, не каждый раз, когда вы создаете человека. Хотя это и работает, это неправильное место для хранения списка людей и должно выполняться на более высоком уровне в вашей программе. – yamen

0

Попробуйте с

Person[] people = new Person[2] { 
       new Person { Name="Allen Frances", Age=11, CanCode=false }, 
        new Person { Name="Burke Madison", Age=50, CanCode=true } 
        }; 
Смежные вопросы