Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Можно использовать явные полевые разметки для этого:
[StructLayout(LayoutKind.Explicit)]
public struct SampleUnion
{
[FieldOffset(0)] public float bar;
[FieldOffset(4)] public int killroy;
[FieldOffset(4)] public float fubar;
}
Непротестированный. Идея состоит в том, что две переменные имеют то же положение в Вашей структуре. Можно, конечно, только использовать одного из них.
[еще 114] информация об объединениях в учебное руководствопо структуре
Вы не можете действительно решить, как иметь дело с этим, не зная что-то о том, как это используется. Если это просто используется для оставления свободного места, то можно проигнорировать его и просто использовать структуру.
Однако, который обычно не является, почему объединения используются. Там две общих причины использовать их. Нужно обеспечить 2 или больше способа получить доступ к тем же данным. Например, объединение интервала и массив 4 байтов - одно (многих) способы выделить байты целого числа на 32 бита.
другой, когда данные в структуре прибыли из внешнего источника, такого как сетевой пакет данных. Обычно один элемент структуры, включающей объединение, является идентификатором, который говорит Вам, которые разновидность объединения в действительности.
Ни в одном из этих случаев может Вы вслепую игнорировать объединение и преобразовывать его в структуру, где два (или больше) поля не совпадают.
В C/C++ объединение используется для накладывания различных участников в той же ячейке памяти, поэтому если у Вас есть объединение интервала и плавания, они оба используют те же 4 байта памяти для хранения, очевидно, пишущий в каждый повреждает другой (так как интервал и плавание имеют различное разрядное расположение).
В.Net Microsoft пошел с более безопасным выбором и не включал эту функцию.
РЕДАКТИРОВАНИЕ: за исключением interop
Лично, я проигнорировал бы ОБЪЕДИНЕНИЕ все вместе и реализовал бы Killroy и Fubar, поскольку отдельные поля
public struct Foo
{
float bar;
int Kilroy;
float Fubar;
}
Используя ОБЪЕДИНЕНИЕ сохраняют 32 бита памяти, выделенной интервалом.... не собирающимся решать судьбу приложения в эти дни.