С# Struct No Construct Constructor? Посмотрите, что мне нужно сделать
Я использую структуру для перехода к неуправляемой 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 будет жаловаться, что "Structs не может содержать явные конструкторы без параметров". Чтобы передать эту структуру в мою DLL, я должен передать массив структуры следующим образом valTable[] val = new valTable[281];
То, что я хотел бы сделать, это когда я говорю new
, вызывается конструктор и создает массив байтов, как я пытаюсь продемонстрировать, потому что DLL ищет этот массив байтов размером 24 в каждом измерении.
Как я могу это сделать?
Ответы
Ответ 1
Вы можете использовать фиксированный размер буфера - который, как я подозреваю, вы действительно хотите в любом случае, чтобы получить данные "inline" в структуре (а не ссылку на массив в другом месте).
public fixed byte name[24];
Вам также нужно объявить структуру как небезопасную.
Обратите внимание, что любое "решение", которое требует вызова статического метода или предоставления какого-либо пользовательского конструктора, потерпит неудачу с вашей явной целью - создать массив этих структур.
Ответ 2
Я бы рекомендовал написать этот код.
[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;
}
}
Ответ 3
Конструкторы Struct аналогичны конструкторам классов, за исключением следующих отличий:
- Структуры не могут содержать явные
безразмерные конструкторы. Struct
члены автоматически инициализируются
к их значениям по умолчанию.
- У структуры не может быть инициализатор
в форме: base (список аргументов).
Это означает, что
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
На основе Asad Butt answer вы можете создать статический метод для выполнения работы вашего конструктора следующим образом:
[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()
сразу приходит в голову. Могут быть и другие.
Ответ 5
Не самое чистое исправление, но вы можете просто добавить параметр и никогда не использовать его?
[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];
}
}
Ответ 6
Для чего вам нужно, вам действительно нужен класс, который я думаю. По умолчанию структура уже реализует конструктор без параметров, поэтому вы не можете определить другой.