Подтвердить что ты не робот

С# base() порядок конструктора

Возможный дубликат:
Порядок выполнения конструктора С#

class Foo
{
    public int abc;
    Foo()
    {
       abc = 3;
    }

}

class Bar : Foo
{
    Bar() : base()
    {
       abc = 2;
    }
}

В приведенном выше примере, когда создается объект Bar, каково будет значение BarObject.abc? Является ли первый конструктор базы первым или работает Bar(),/then/конструктор base()?

4b9b3361

Ответ 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() вызывается первым.

Для таких вещей напишите простое тестовое приложение и настройте некоторые точки останова, чтобы найти ответ.