Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кое что о структурах (value type) в .NET

5
04 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Сперва о веселом:
1) Структурам можно назначать собственные "конструкторы по-умолчанию".
2) Структуры можно наследовать.


Пример кода (CIL):
Код:
.assembly Test1
{
}

.class public sequential ansi beforefieldinit ValueTypeCtor.MyStruct
       extends [mscorlib]System.ValueType
{
  .field public int32 Field1

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    .maxstack  8
    ldstr "Default constructor for value type has overriden!"
    call void [mscorlib]System.Console::WriteLine(string)
    ret
  } // end of method MyStruct::.ctor

  .method public hidebysig specialname rtspecialname
          instance void  .ctor(int32 field1) cil managed
  {
    // Code size       9 (0x9)
    .maxstack  8
    ldarg.0
    ldarg.1
    stfld      int32 ValueTypeCtor.MyStruct::Field1
    ret
  } // end of method MyStruct::.ctor

} // end of class ValueTypeCtor.MyStruct


.class public sequential ansi sealed beforefieldinit ValueTypeCtor.MyStruct2
       extends ValueTypeCtor.MyStruct
{

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    .maxstack  8
    ldarg.0
    call       instance void ValueTypeCtor.MyStruct::.ctor()
    ret
  } // end of method MyStruct2::.ctor

} // end of class ValueTypeCtor.MyStruct2
А теперь о грустном.

1) Конструктор-то можно создать. Только компилятор будет требовать вызывать его явно:
 
Код:
MyStruct str = new MyStruct();
Автоматически для элементов массива таких структур вызываться он не будет. А жаль, правда?


2) Код соберется, да только рантайм будет ругаться при попытке загрузить тип (явно в коде имя типа писать нельзя - csc.exe от такого срывает башку)
 
Код:
object obj = Activator.CreateInstance(Type.GetType("ValueTypeCtor.MyStruct2, Test1"));
Он скажет о том, что тип-предок (MyStruct) - герметичный, похоже что CLR автоматически всем потомкам System.ValueType поднимает флаг sealed.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог