Страницы

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

воскресенье, 10 марта 2019 г.

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

Подскажите пожалуйста, как реализовать Вот исходный код
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 не обращайте внимания это для сокращения кода


Ответ

Ну у вас по сути сложение по модулю, поэтому можно записать вместо 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) ));

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

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