Я использую структуру для передачи неуправляемому 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 в каждом размере.
Как я могу выполнить это?
Вы можете использовать буфер фиксированного размера , который, как я подозреваю, вам действительно нужен, чтобы данные были встроены в структура (а не ссылка на массив в другом месте).
public fixed byte name[24];
Вам также необходимо объявить структуру небезопасной.
Обратите внимание, что любое «решение», требующее вызова статического метода или предоставления любого вида настраиваемого конструктора, не удастся с вашей явной целью создания массива этих структур.
Я бы рекомендовал написать этот код.
[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;
}
}
Основываясь на ответе Асада Батта , вы можете создать статический метод для выполнения работы вашего конструктора следующим образом:
[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 ()
сразу приходит на ум. Могут быть и другие.
Не самое чистое исправление, но можно просто добавить параметр и никогда его не использовать?
[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];
}
}
Для того, что вам нужно сделать, вам действительно нужен класс, я думаю. Структура уже реализует конструктор без параметров по умолчанию, поэтому вы не можете определить еще один.
Конструкторы структур похожи на конструкторы классов, за исключением следующих различий:
Это означает, что
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 для получения структур, инициализированных определенными значениями.
ссылка; Структуры не могут содержать явные конструкторы без параметров. ПОЧЕМУ?