Страницы

Поиск по вопросам

среда, 22 января 2020 г.

C# Короткая запись метода с помощью анонимного делегата

#c_sharp #делегаты


Подскажите пожалуйста, как реализовать 
Вот исходный код

vm.RegisterCommand('+', v => Inc(v));
private static void Inc(IVirtualMachine v)
{
    if (v.Memory[v.MemoryPointer] == (char)255)
        v.Memory[v.MemoryPointer] = (char)0;
    else
        v.Memory[v.MemoryPointer]++;
}


Хочу заменить на что то вроде 

vm.RegisterCommand('+', b => (b.Memory[b.MemoryPointer] == 255) ? 1 : 2 );


на 1:2 не обращайте внимания это для сокращения кода
    


Ответы

Ответ 1



Ну у вас по сути сложение по модулю, поэтому можно записать вместо if что-то вроде v.Memory[v.MemoryPointer] = (char)((v.Memory[v.MemoryPointer] + 1) % 256), ну и, соответственно, в виде лямбды: vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer] = (char)((v.Memory[v.MemoryPointer] + 1) % 256)); Если IVirtualMachine.Memory – это реально byte-массив, то код можно сократить: vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer]++)); Если вы хотите переписать свой метод дословно, то это будет выглядеть так: vm.RegisterCommand('+', v => { if (v.Memory[v.MemoryPointer] == (char)255) v.Memory[v.MemoryPointer] = (char)0; else v.Memory[v.MemoryPointer]++; }); Но это не улучшает читаемость, а даже скорее наоборот. А с использованием тернарного оператора, например, так: vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer] = (char)(v.Memory[v.MemoryPointer] == 255 ? 0 : (v.Memory[v.MemoryPointer] + 1) ));

Комментариев нет:

Отправить комментарий