R Read Ответов: 2

У меня есть класс,который я хотел бы добавить эквивалент указателя функции C.


Я хотел бы иметь возможность добавить эквивалент c# указателя функции C в класс 'clientInfo' ниже. Это позволит мне избавиться от оператора switch при обработке входящих данных. Данные "clientInfo" инициализируются и помещаются в список "clientInfo", из которого могут быть обработаны входящие данные.


публичный класс dataFormat
{
общественного строка имя-канала;
публичное байтовое расположение данных;
общественные байт lengthbytes;
формат public FormatType;
// Я хочу добавить здесь эквивалент указателя функции
}

публичный класс clientInfo
{
описание публичной строки;
адреса общественных типа uint16 ;
общественные байт приложения в P;
публичный список данных & lt;dataformat> data;
}

List< clientinfo> clientList = новый список & lt;clientinfo>();

// фиктивные данные для тестирования
byte[] tooldesc = new byte[] {0x5A, 0x55, 0x55, TOOL_INFO_READ, 0x10, 0x00, 0x30, 0x31, 0x40, 0x01, 0x02, 0x03, 0x54, 0x65, 0x73, 0x74, 0x20, 0x54, 0x6F, 0x6F, 0x6C, 0xFF, 0xFF, 0xA5};

публичная основная форма()
{

метод InitializeComponent();

InitialiseTools (); / / настройка данных инструмента

// Теперь просто пример того, как я обрабатываю входящие данные
// использование tooldesc, определенного выше.

List< byte [] & gt; bufferr = новый список & lt;byte[]>();
буферр.Добавить (tooldesc);
int n = 0;
for (int clientIdx = 0; clientIdx < clientList.Count; clientIdx++)
{
if (clientList[clientIdx]. address == 0x5555)
{
// Вместо того, что приведенная ниже инструкция выключатель, функция
// указатель сможет вызвать назначенную функцию
// например ProcessGammaCCL () и т. д.

int type = (int)(clientList[clientIdx].приложения в P);
тип коммутатора)
{
случай 0xB8:
ProcessGammaCCl(clientIdx, bufferr[n]);
перерыв;
случай 0x89:
UpdateToolTable(clientIdx, bufferr[n]);
перерыв;
по умолчанию:
перерыв;
}
}
}
}


частный недействительными InitialiseTools()
{
// В идеале считывать данные из ini-файла в данные инструмента и добавлять их в клиент
// список
// Может добавить функцию ptr для соответствующего вызова функции

clientinfo tool = новый clientInfo();
tool. description = " описание инструмента";
tool. address = 0x5555;
инструмент.pCode = 0x89;

var channelInfo = новый список & lt;dataformat>
{

новый формат данных
{
channelName = " адрес",
dataPosition = 1,
lengthbytes = 2,
формат = FormatType.s16lsb
},
новый формат данных
{
channelName = " описание",
dataPosition = 12,
lengthbytes = 4,
формат = FormatType.ул.

},
};

инструмент.data = channelInfo;
clientList.Добавить(инструмент);

/ Инструмент / гамма ККЛ
clientInfo tool1 = новый clientInfo();
tool1. description = " Gamma GCL";
tool1. address = 0x5555;
инструмент1.pCode = 0xB8;

channelInfo = новый список & lt;dataformat>
{

новый формат данных
{
channelName = " отметка времени",
dataPosition = 6,
lengthbytes = 4,
формат = FormatType.u32lsb
},
новый формат данных
{
channelName = " CCL",
dataPosition = 10,
lengthbytes = 2,
формат = FormatType.s12bitlsb

},
новый формат данных
{
имя-канала = "статус-ВЛ ОК ",
dataPosition = 11,
lengthbytes = 1,
формат = FormatType.bitMask0x10
},
новый формат данных
{
имя-канала = "счетчик гамма ",
dataPosition = 12,
lengthbytes = 2,
формат = FormatType.u16lsb
}
};

tool1. data = channelInfo;
clientList. Add(tool1);
}

private void ProcessGammaCCl(int i, Byte[] buffer)
{
.......
int bufferPos = clientList[i]. data[0]. dataPosition;
.......
}

Что я уже пробовал:

Я погуглил это toopic и нашел ссылки на использование делегатов и функций< & gt;, Но не нашел ничего, что я мог бы понять и imlement!

2 Ответов

Рейтинг:
5

OriginalGriff

Делегаты-это фактически указатели функций, и они довольно просты, как только вы начинаете их понимать.
Начните с самого начала: Делегаты (Руководство По Программированию На C#) | Microsoft Docs[^]
Затем переходите к собранию делегатов: c# - Как хранить делегатов в списке-переполнение стека[^] и рассмотрите словарь вместо вашего переключателя.


R Read

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

OriginalGriff

Это стандартные справочные документы, и вы должны начать с них - у них может быть "кривая обучения кирпичной стены", но они являются окончательными, и не пропустите такие вещи, как случайные веб-сайты, которые могут быть слишком легко.

Рейтинг:
18

Pete O'Hanlon

Я продемонстрировал, как использовать Action<T> чтобы покончить с операторами switch в этот[^] блог. Если вы скачаете прилагаемый образец кода, то сможете проследить, как он работает.