Основа C# () порядок конструктора [дубликат]

20
задан Community 23 May 2017 в 11:47
поделиться

6 ответов

Будет 2. Конструкторы выполняются по порядку от базового класса первым до наследуемого класса последним.

Обратите внимание, что инициализаторы (как статические, так и экземпляровые переменные) работают в обратном направлении.

Полная последовательность здесь: http://www.csharp411.com/c-object-initialization/

37
ответ дан 29 November 2019 в 23:30
поделиться

Первый конструктор базового класса вызывается, за ним следует конструктор производного класса. Результат - 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

Неужели вам просто нравится мое пространство имён :-). Кстати, вы также можете использовать автоматические свойства, чтобы это свойство было просто публичным int ABC {get;set;}.

.
4
ответ дан 29 November 2019 в 23:30
поделиться

Если предположить, что вы делаете abc защищенным так, чтобы он компилировался, то будет 2; однако сначала вызывается base().

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

.
2
ответ дан 29 November 2019 в 23:30
поделиться

Переменная abc будет установлена на 3, а затем изменена на 2 (сначала вызывается базовый конструктор)

.
1
ответ дан 29 November 2019 в 23:30
поделиться

Базовым конструктором будет , называемый первым , но этот код не компилируется . Приватные поля недоступны из подклассов. По крайней мере, поле должно быть защищено для использования в подклассе.

Но даже зная это, поведение, которое вы пытаетесь предпринять, сбивает с толку, потому что это удивительно. Просто тот факт, что вы должны были спросить, в каком порядке идут вещи, подразумевает, что они будут запутаны, когда ордер будет забыт.

.
1
ответ дан 29 November 2019 в 23:30
поделиться

Сначала вызывается базовый констуктор, для abc

значение 2.
1
ответ дан 29 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: