С# base() порядок конструктора
Возможный дубликат:
Порядок выполнения конструктора С#
class Foo
{
public int abc;
Foo()
{
abc = 3;
}
}
class Bar : Foo
{
Bar() : base()
{
abc = 2;
}
}
В приведенном выше примере, когда создается объект Bar, каково будет значение BarObject.abc? Является ли первый конструктор базы первым или работает Bar(),/then/конструктор base()?
Ответы
Ответ 1
Это будет 2. Конструкторы выполняются в порядке от базового класса сначала до унаследованного класса last.
Обратите внимание, что инициализаторы (как статические, так и переменные экземпляра) работают в противоположном направлении.
Полная последовательность здесь: http://www.csharp411.com/c-object-initialization/
Ответ 2
Вызывается первый конструктор базового класса, за которым следует конструктор производного класса.
Результат - 2. Вы должны явно указать доступность этой переменной класса.
Является ли он защищенным, частным или общественным?
Я вижу, что вы изменили его на публике, так что это будет 2.
Эта ссылка поможет вам понять конструкторы, как они используются, когда они вызывают, и порядок вызова конструктора при использовании наследования:
http://www.yoda.arachsys.com/csharp/constructors.html
Также вы можете попробовать это самостоятельно, вы узнаете больше, практикуя и записывая код, а затем просто читаете его.
Попробуйте объявить Bar и вывести его значение. Используйте некоторые свойства:
class Foo
{
public int abc;
public Foo()
{
abc = 3;
}
public int ABC
{
get { return abc; }
set { abc = value; }
}
}
class Bar : Foo
{
public Bar() : base()
{
abc = 2;
}
}
class Program
{
static void Main(string[] args)
{
Bar b = new Bar();
Console.WriteLine(b.ABC);
Console.ReadLine();
}
}
Простая распечатка даст результат, который вы ищете. Вот результат:
alt text http://img141.imageshack.us/img141/9238/rrrrr.jpg
Разве ты не любишь мой namespace
:-). Кстати, вы также можете использовать автоматические свойства, чтобы свойство было просто public int ABC {get; set;}.
Ответ 3
Переменная abc будет установлена равной 3, а затем будет изменена на 2 (сначала будет создан базовый конструктор).
Ответ 4
Базовый конструктор будет вызван первым, но этот код не компилируется. Частные поля недоступны из подклассов. По крайней мере, поле должно быть protected для использования в подклассе.
Но даже зная об этом, поведение, которое вы пытаетесь, сбивает с толку, потому что это удивительно. Просто тот факт, что вам нужно было спросить, что происходит в порядке, означает, что он будет запутан, когда заказ будет забыт.
Ответ 5
Базовый constuctor вызывается первым, и вы должны иметь значение 2 для abc
Ответ 6
Предполагая, что вы защищаете abc так, чтобы это скомпилировалось, это будет 2; однако base() вызывается первым.
Для таких вещей напишите простое тестовое приложение и настройте некоторые точки останова, чтобы найти ответ.