Я переводил игру C: https://github.com/minirop/Super-Mario-Remake в C# для удовольствия и для улучшения моего программирования на C#. Я не настолько разбираюсь в программировании на C и наткнулся на структуру, которую я не знаю, как реализовать на C#.Перевод этой C-структуры на C#
typedef struct _state_t {
void (*init)(struct _state_t * s);
void (*update)(struct _state_t * s, Uint32 elapsedTime);
void (*handleEvent)(struct _state_t * s);
void (*draw)(struct _state_t * s, SDL_Surface * surface);
void (*clean)(struct _state_t * s);
void * data;
} state_t;
Что я пытался до сих пор:
public class state_t
{
public void init(state_t S)
{
state_t s;
s = S;
}
public void update(state_t S, UInt32 ElapsedTime)
{
state_t s;
UInt32 elapsedTime;
s = S;
elapsedTime = ElapsedTime;
}
public void handleEvent(state_t S)
{
state_t s;
s = S;
}
public void draw(state_t S, SDL.SDL_Surface Surface)
{
state_t s;
SDL.SDL_Surface surface;
s = S;
surface = Surface;
}
public void clean(state_t S)
{
state_t s;
s = S;
}
public void data()
{
}
}
Но я не думаю, что это правильно. Я получил сообщение об ошибке:
state_t MS_get()
{
state_t state = new state_t();
state.init = MS_init; // Error 2 Cannot assign to 'init' because it is a 'method group'
} ...
My C ржавеет, но он выглядит как указатель на функцию. Поэтому 'init' должен переводить на что-то вроде' public Action <_state_t> init; '. Тем не менее, если вы попробуете преобразование 1: 1, вы быстро столкнетесь с ограничениями на C#. Лучше попытаться понять код, а затем переписать его с помощью подхода ООП. –
Хорошо, спасибо. Я попробую это. Да, это также мое намерение переписать это на ООП. Я вообще не опытный программист, поэтому я пробовал и пробовал много. – Runebjornb
Это грубый эквивалент интерфейса. Все члены - это данные, а не код. Указатели функций. Вы пишете эквивалентную структуру с членами делегата. Сначала вам нужно объявить типы делегатов, для изменения CallingConvention в Cdecl потребуется атрибут [UnmanagedFunctionPointer]. Если вы должны инициализировать структуру вместо ее использования, тогда инициализируйте объекты-делегаты-члены для нацеливания метода в вашем коде. Не забудьте сохранить его в * статической * переменной, чтобы сборщик мусора не избавился от него. Много способов проиграть, проще сделать в C++/CLI. –