Объединение C++ в C#

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

70
задан timrau 15 August 2012 в 00:01
поделиться

4 ответа

Можно использовать явные полевые разметки для этого:

[StructLayout(LayoutKind.Explicit)] 
public struct SampleUnion
{
    [FieldOffset(0)] public float bar;
    [FieldOffset(4)] public int killroy;
    [FieldOffset(4)] public float fubar;
}

Непротестированный. Идея состоит в том, что две переменные имеют то же положение в Вашей структуре. Можно, конечно, только использовать одного из них.

[еще 114] информация об объединениях в учебное руководство

по структуре

76
ответ дан Armin Ronacher 24 November 2019 в 13:29
поделиться

Вы не можете действительно решить, как иметь дело с этим, не зная что-то о том, как это используется. Если это просто используется для оставления свободного места, то можно проигнорировать его и просто использовать структуру.

Однако, который обычно не является, почему объединения используются. Там две общих причины использовать их. Нужно обеспечить 2 или больше способа получить доступ к тем же данным. Например, объединение интервала и массив 4 байтов - одно (многих) способы выделить байты целого числа на 32 бита.

другой, когда данные в структуре прибыли из внешнего источника, такого как сетевой пакет данных. Обычно один элемент структуры, включающей объединение, является идентификатором, который говорит Вам, которые разновидность объединения в действительности.

Ни в одном из этих случаев может Вы вслепую игнорировать объединение и преобразовывать его в структуру, где два (или больше) поля не совпадают.

22
ответ дан Steve Fallows 24 November 2019 в 13:29
поделиться

В C/C++ объединение используется для накладывания различных участников в той же ячейке памяти, поэтому если у Вас есть объединение интервала и плавания, они оба используют те же 4 байта памяти для хранения, очевидно, пишущий в каждый повреждает другой (так как интервал и плавание имеют различное разрядное расположение).

В.Net Microsoft пошел с более безопасным выбором и не включал эту функцию.

РЕДАКТИРОВАНИЕ: за исключением interop

3
ответ дан Striezel 24 November 2019 в 13:29
поделиться

Лично, я проигнорировал бы ОБЪЕДИНЕНИЕ все вместе и реализовал бы Killroy и Fubar, поскольку отдельные поля

public struct Foo
{
    float bar;
    int Kilroy;
    float Fubar;
}

Используя ОБЪЕДИНЕНИЕ сохраняют 32 бита памяти, выделенной интервалом.... не собирающимся решать судьбу приложения в эти дни.

1
ответ дан ckramer 24 November 2019 в 13:29
поделиться
Другие вопросы по тегам:

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