Структура C# Никакой Конструктор Без параметров? Посмотрите то, что я должен выполнить

Я использую структуру для передачи неуправляемому DLL как так -

[StructLayout(LayoutKind.Sequential)]
        public struct valTable
        {
            public byte type;
            public byte map;
            public byte spare1;
            public byte spare2;
            public int par;
            public int min;
            public byte[] name;
            public valTable()
            {
                name = new byte[24];
            }
        }

Код выше не скомпилирует, потому что VS, 2005 будет жаловаться, что "Структуры не могут содержать явных конструкторов без параметров". Для передачи этой структуры моему DLL я должен передать массив структуры как так valTable[] val = new valTable[281];

То, что я хотел бы сделать, - когда я говорю new, конструктора вызывают, и это создает массив байтов как, я пытаюсь продемонстрировать, потому что DLL ищет тот массив байтов размера 24 в каждом размере.

Как я могу выполнить это?

14
задан 3 March 2010 в 14:32
поделиться

6 ответов

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

public fixed byte name[24];

Вам также необходимо объявить структуру небезопасной.

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

20
ответ дан 1 December 2019 в 07:51
поделиться

Я бы рекомендовал написать этот код.

[StructLayout(LayoutKind.Sequential)]
public struct valTable
{
    public byte type;
    public byte map;
    public byte spare1;
    public byte spare2;
    public int par;
    public int min;
    public byte[] name;

    static public valTable Create()
    {
        valTable vT = new valTable();
        vT.name = new byte[24];
        return vT;
    }
}
6
ответ дан 1 December 2019 в 07:51
поделиться

Основываясь на ответе Асада Батта , вы можете создать статический метод для выполнения работы вашего конструктора следующим образом:

[StructLayout(LayoutKind.Sequential)]
public struct valTable
{
    public byte type;
    public byte map;
    public byte spare1;
    public byte spare2;
    public int par;
    public int min;
    public byte[] name;
    public valTable()

    public static valTable NewTable()
    {
        valTable tbl = new valTable();
        tbl.name = new byte[24];
        return tbl;
    }
}

Вы увидите классы в .NET Framework уже следует этому шаблону. Guid.NewGuid () сразу приходит на ум. Могут быть и другие.

4
ответ дан 1 December 2019 в 07:51
поделиться

Не самое чистое исправление, но можно просто добавить параметр и никогда его не использовать?

[StructLayout(LayoutKind.Sequential)]
    public struct valTable
    {
        public byte type;
        public byte map;
        public byte spare1;
        public byte spare2;
        public int par;
        public int min;
        public byte[] name;
        public valTable(int x)
        {
            name = new byte[24];
        }
    }
2
ответ дан 1 December 2019 в 07:51
поделиться

Для того, что вам нужно сделать, вам действительно нужен класс, я думаю. Структура уже реализует конструктор без параметров по умолчанию, поэтому вы не можете определить еще один.

-2
ответ дан 1 December 2019 в 07:51
поделиться

Конструкторы структур похожи на конструкторы классов, за исключением следующих различий:

  • Структуры не могут содержать явных конструкторы без параметров. Структура члены автоматически инициализируются в значения по умолчанию.
  • Структура не может иметь инициализатор в форме: base (argument-list).

Это означает, что

A default(parameterless) constructor for a struct could set different
values than the all-zeroed state which would be unexpected behavior. The
.Net Runtime therefore prohabits default constructors for struct.

Типичный способ обойти этот сценарий - создать статический метод. который создаст ваш новый экземпляр, инициализирует его так, как вы хотите, и возвращает его. Именно так делается в .NET для получения структур, инициализированных определенными значениями.


ссылка; Структуры не могут содержать явные конструкторы без параметров. ПОЧЕМУ?

4
ответ дан 1 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

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