Эквивалент структуры в C# - PullRequest
0 голосов
/ 17 января 2020

Что такое C# -эквивалент следующей структуре из C:

struct  netbuf{
unsigned int    maxlen;
unsigned int    len;
char            *buf;
};

Я перевел это как:

public struct netbuf
{
    public uint maxlen;
    public uint len;
    public string buf;
};

, но, похоже, это не так правильно.

У меня есть устаревший c код:

datagramm.addr.maxlen   = 0;
datagramm.addr.len      = 0;
datagramm.addr.buf      = (char*) 0;
datagramm.opt.maxlen    = 0;
datagramm.opt.len       = 0;
datagramm.opt.buf       = (char*) 0;

datagramm.udata.len   = sizeof(xliconf);
datagramm.udata.buf   = (char*)&xliconf;

xliconf.ccb_h.source = (uint8)ctrl_ed;
rval = xli_sndudata(ctrl_ed,&datagramm);

, где объявление xli_sndudata из заголовка:

int xli_sndudata( int , struct t_unitdata *);

и

struct t_unitdata{
    struct netbuf   addr;     
    struct netbuf   opt;  
    struct netbuf   udata;   
};

Структура netbuf выше. Мне нужно перевести этот код в C#.

Ответы [ 2 ]

3 голосов
/ 17 января 2020
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct netbuf
{
    public ushort maxlen;
    public ushort len;
    public IntPtr buf;
};
0 голосов
/ 17 января 2020

Это прекрасно. Хотя структура не является классом, синтаксис очень близок, с некоторыми ограничениями, как описано здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/struct

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

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

Официальный пример очень похож на тот, который у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...