Рейтинг:
6
OriginalGriff
Отчасти потому, что вам нужно написать свое имя метода таким же образом в определении и вызове...
Но главным образом потому, что инициализация поля выполняется до построения экземпляра: и конструктор должен быть первым методом, вызванным в экземпляре (или другие методы не могут полагаться на какую-либо другую информацию).
И поля должны быть инициализированы до того, как фактический конструктор начнет выполняться, или он может установить значения, которые перезаписываются инициализаторами полей!
Вы можете сделать это с помощью статических методов:
class SomeRandomName
{
public int age = ReturnAge();
public static int ReturnAge()
{
return 23;
}
}
Потому что статический метод не может получить доступ к каким-либо данным экземпляра и поэтому должен быть полностью подготовлен до создания экземпляра.
Цитата:
Таким образом, поле экземпляра должно содержать данные, известные во время компиляции, или оно должно использовать статический метод, поскольку статический класс создается с помощью статического конструктора по умолчанию перед любым объектом экземпляра. Правильно ли я это понимаю? Но это работает, если вы делаете поле ссылкой на объект, который указывает на объект этого типа. Можете ли вы объяснить, почему это происходит?
То же самое происходит и в том случае, если вы используете вложенный класс, подобный этому:
class SomeRandomName
{
public InnerRandomClass irc = new InnerRandomClass();
public class InnerRandomClass
{
}
}
Цитата:
Таким образом, поле экземпляра должно содержать данные, известные во время компиляции
Нет, данные инициализатора не обязательно должны быть известны во время компиляции:
Цитата:
класс SomeRandomName
{
public int age = возврат средств();
public static int ReturnAge()
{
Базы данных mydb дБ = новый присваивается();
возврат БД.GetAge();
}
}
Это нормально - класс MyDB считывает данные из SQL и возвращает их, возможно.
Цитата:
он должен использовать статический метод, поскольку статический класс создается с помощью статического конструктора по умолчанию перед любым объектом экземпляра.
- Да!
Цитата:
Но это работает, если вы делаете поле ссылкой на объект, который указывает на объект этого типа. Можете ли вы объяснить, почему это происходит?
Нет, потому что это не имеет никакого смысла для меня! :смеяться:
Попробуйте объяснить еще раз, с примерами.
Цитата:
То же самое происходит и при использовании вложенного класса
Это не проблема, потому что "вложенный класс" - это просто класс с полным именем, которое включает в себя все его "родительские классы"-фактический класс ничем не отличается от не вложенного класса, только имя зависит от вложенности.
The_Unknown_Member
Таким образом, поле экземпляра должно содержать данные, известные во время компиляции, или оно должно использовать статический метод, поскольку статический класс создается с помощью статического конструктора по умолчанию перед любым объектом экземпляра. Правильно ли я это понимаю? Но это работает, если вы делаете поле ссылкой на объект, который указывает на объект этого типа. Можете ли вы объяснить, почему это происходит?
The_Unknown_Member
То же самое происходит и в том случае, если вы используете вложенный класс, подобный этому:
класс SomeRandomName
{
public InnerRandomClass irc = новый InnerRandomClass();
публичный класс InnerRandomClass
{
}
}
OriginalGriff
Ответ обновлен.
The_Unknown_Member
- Нет, потому что для меня это не имеет никакого смысла! :смеяться:
Попробуйте объяснить еще раз, с примерами." Что ж, вы правы. Это дает исключение StackOverflowException. Почему он дает исключение StackOverflowException? однако он прекрасно работает с полем baseclass в производном классе:
общественного класса baseclass
{
}
DerivedClass общественных класса : Класс
{
public DerivedClass dc = new DerivedClass(); // вообще не работает
public BaseClass bc = new BaseClass(); // работает отлично!!!
}
OriginalGriff
Вы удивлены, что дает переполнение стека? Я не...
Предположим, вы создаете экземпляр DerivedClass в своем основном методе:
void main()
{
DerivedClass dc = new DerivedClass();
}
Первое, что должна сделать система, - это выделить память (нормально) и инициализировать поля. И первое поле, которое он пытается инициализировать, создает новый экземпляр того же класса. Который пытается инициализировать свои поля, что создает новый экземпляр, который ... *БУМ*
Экземпляр BaseClass хорош, потому что он не пытается создать экземпляр самого себя (или DerivedClass) и настроить бесконечный цикл создания объекта.
The_Unknown_Member
О, это бесконечная рекурсия... Я понял, в чем дело. Спасибо за разъяснение!
OriginalGriff
Всегда пожалуйста!
Всякий раз, когда вы видите "переполнение стека", первое, что нужно искать, - это рекурсия-кто-то обычно делает что-то глупое :смеется: