powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ObjectCollectionInitializers
3 сообщений из 3, страница 1 из 1
ObjectCollectionInitializers
    #38975722
newbie3732
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наткнулся в Инициализаторы объектов в блоке using Гарантии безопасности исключений на
И, по сути, так оно и есть, только с небольшим уточнением:
Код: c#
1.
2.
3.
4.
var tmp = new Person();
tmp.Name = "Jonh";
tmp.Age = 42;
var person = tmp;



У Рихтера об этом ни слова. Решил проверить
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace TestObjectCollectionInitializers
{
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var person = new Person { Name = "Jonh", Age = 42 };
        }
    }
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       26 (0x1a)
  .maxstack  2
  .locals init ([0] class TestObjectCollectionInitializers.Person '<>g__initLocal0')
  IL_0000:  newobj     instance void TestObjectCollectionInitializers.Person::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  ldstr      "Jonh"
  IL_000c:  callvirt   instance void TestObjectCollectionInitializers.Person::set_Name(string)
  IL_0011:  ldloc.0
  IL_0012:  ldc.i4.s   42
  IL_0014:  callvirt   instance void TestObjectCollectionInitializers.Person::set_Age(int32)
  IL_0019:  ret
} // end of method Program::Main


Не наблюдаю. Пусть Release и оптимизация виноваты.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
namespace TestObjectCollectionInitializers
{
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var person = new Person { Name = "Jonh", Age = 42 };
            var name = person.Name;
        }
    }
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       35 (0x23)
  .maxstack  2
  .locals init ([0] class TestObjectCollectionInitializers.Person person,
           [1] class TestObjectCollectionInitializers.Person '<>g__initLocal0')
  IL_0000:  newobj     instance void TestObjectCollectionInitializers.Person::.ctor()
  IL_0005:  stloc.1            // в 1 - tmp
  IL_0006:  ldloc.1            // this для set_Name()
  IL_0007:  ldstr      "Jonh"  //value для set_Name()
  IL_000c:  callvirt   instance void TestObjectCollectionInitializers.Person::set_Name(string)
  IL_0011:  ldloc.1            // this для set_Age()
  IL_0012:  ldc.i4.s   42      //value для set_Age()
  IL_0014:  callvirt   instance void TestObjectCollectionInitializers.Person::set_Age(int32)
  IL_0019:  ldloc.1            // Load local variable 1 onto stack. (tmp)
  IL_001a:  stloc.0            // Pop a value from stack into local variable 0. (person)
  IL_001b:  ldloc.0            // this для get_Name()
  IL_001c:  callvirt   instance string TestObjectCollectionInitializers.Person::get_Name()
  IL_0021:  pop
  IL_0022:  ret
} // end of method Program::Main


Оно? Или я неправильно понимаю? Или человек нафантазировал?
...
Рейтинг: 0 / 0
ObjectCollectionInitializers
    #38975744
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie3732Или человек нафантазировал?
не нафантазировал - фича насчёт юзинга и исключения в инициализаторе - известная.

с другой стороны - ликвидация недоконструированного либо недоинициализированного объекта мало чем отличаются - забота мусоросборщика


ну а объект-калеку получить можно без проблем, сохранив где либо ссылку на конструируемый/инициализируемый объект до возникновения исключения
...
Рейтинг: 0 / 0
ObjectCollectionInitializers
    #38975782
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не называл объект, у которого рванул именно инициализатор, а не конструктор (т.е. исключение было вызвано в сеттере свойства) недоконструированным/недоинициализированным - нормальные люди обычно задают необходимый минимум для корректной инициализации объекта именно параметрами конструктора; значения свойств, задаваемые через сеттеры - опциональное состояние объекта. Если это не так (в инициализаторе через свойства задается необходимое минимальное инициализированное и корректное состояние), то автор - ССЗБ.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ObjectCollectionInitializers
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]