Почему основные конструкторы C# 12 выполняются в противоположном порядке?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему основные конструкторы C# 12 выполняются в противоположном порядке?

Сообщение Anonymous »


Почему основные конструкторы в C# 12 выполняются в обратном порядке?

Это своего рода революционное изменение, если не сказать больше...

Пример:

пространство имен Что угодно; [ТестКласс] публичный класс UnitTestTemp { [Метод испытания] public void TestMethod1() // ожидается PASS //, 1-й — 1, 2-й — 2 { используя поток var = новый MemoryStream (новый байт [] { 1, 2, 3, 4 }); вар classicDerived = новый ClassicDerived (поток); Console.WriteLine(classicDerived.Value1); Console.WriteLine(classicDerived.Value2); Assert.AreEqual(1, classicDerived.Value1); Assert.AreEqual(2, classicDerived.Value2); } [Метод испытания] public void TestMethod2() // FAIL // противоположно, первый — 2, второй — 1 { используя поток var = новый MemoryStream (новый байт [] { 1, 2, 3, 4 }); вар PrimaryDerived = новый PrimaryDerived (поток); Console.WriteLine(primaryDerived.Value1); Console.WriteLine(primaryDerived.Value2); Assert.AreEqual(1, PrimaryDerived.Value1); Assert.AreEqual(2, PrimaryDerived.Value2); } } Классический конструктор:

публичный класс ClassicBase { общедоступный только для чтения int Value1; защищенный ClassicBase (поток потока) { Значение1 = поток.ReadByte(); } } общедоступный класс ClassicDerived: ClassicBase { общедоступное только для чтения int Value2; public ClassicDerived (поток потока): база (поток) { Значение2 = поток.ReadByte(); } } Основной конструктор:

публичный класс PrimaryBase (поток потока) { public readonly int Value1 =stream.ReadByte(); } общедоступный класс PrimaryDerived (поток потока): PrimaryBase (поток) { public readonly int Value2 =stream.ReadByte(); } Результат первого теста:

 TestMethod1 Источник: UnitTestTemp.cs line 7 Длительность: 4 мс Стандартный вывод: 1 2 Результат второго теста:

 TestMethod2 Источник: UnitTestTemp.cs line 21 Продолжительность: 26 мс Сообщение: Ошибка Assert.AreEqual. Ожидается: . Фактический:. Трассировки стека: UnitTestTemp.TestMethod2() строка 30 RuntimeMethodHandle.InvokeMethod(цель объекта, аргументы Void**, подпись подписи, логическое значение isConstructor) MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags ignoreAttr) Стандартный вывод: 2 1 Как видите, это немного проблематично, если вы, например, используете поток из конструкторов.

Вопрос:

Есть ли другой способ решить эту проблему, кроме возврата к классическим конструкторам?

(думал о чем-то вроде SetsRequiredMembers для нового обязательного модификатора)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»