Хотя этот вопрос может показаться глупым на первый взгляд, пожалуйста, выслушайте меня.C# вызывать метод всякий раз, когда заканчивается другой метод?
Методы C# 'get {} и set {} являются чрезвычайно полезными в ситуациях, когда вы не знаете, как ваши задачи программирования будут развиваться при создании вашего кода. Я наслаждался их свободой много раз, и теперь мне интересно, есть ли что-то подобное для методов, но в немного другом свете.
Поскольку я работаю в gamedev, очень распространенной практикой является расширение/обновление/улучшение существующего дневного дневного кода. Поэтому один из шаблонов, которым я научился следовать, заключается в том, чтобы никогда не использовать «возврат» более одного раза в большинстве моих методов.
Причина, по которой я делаю это, - всегда иметь возможность написать что-то в нижней части метода и быть уверенным, что строка, которую я написал, всегда называется 100% времени, как только мой метод ENDS.
Вот пример:
public void Update()
{
UpdateMovement();
if (IsIncapacitated)
return;
if (IsInventoryOpened)
{
UpdateInventory();
return;
}
if (Input.HasAction(Actions.Fire))
{
Fire();
return;
}
else if (Input.HasAction(Actions.Move))
{
Move(Input.Axis);
return;
}
}
Теперь представьте себе, что этот метод называют десятки раз во многих местах по всей полноте вашего проекта. И затем на следующий день вы решите, что вам нужно вызвать метод UpdatePhysics() в самом конце вашего метода Update(). В этом случае есть только 4 возвращения, в действительности это может быть намного хуже.
Тогда представьте, что такие дебаты происходят несколько раз в день каждый день. Плохое планирование, которое вы можете сказать? Я могу согласиться с вами, но я считаю, что свобода развития необходима в современном кодировании. Я не думаю, что вы должны убить себя, пытаясь предвидеть каждый ход вашего проекта, прежде чем начинать писать код.
Один из способов гарантировать, что такие проблемы, как я описал выше, не бывает, чтобы переписать метод следующим образом:
public void Update()
{
UpdateMovement();
if (!IsIncapacitated)
{
if (IsInventoryOpened)
{
UpdateInventory();
}
else
{
if (Input.HasAction(Actions.Fire))
{
Fire();
}
else if (Input.HasAction(Actions.Move))
{
Move(Input.Axis);
}
}
}
}
В этом случае вы всегда можете добавить строку в нижней части, и убедитесь, что он будет всегда получаю называемый nomatter какой.
Так что я хотел спросить, есть ли другой подход, который может позволить разместить «return» -s, где бы вы ни пожелали, все еще будучи в состоянии добавить дополнительный код в нижней части метода в любое время. Может быть, есть какая-то форма синтаксиса в C#, которая делает это для вас? Или, может быть, существует более совершенная практика кодирования, которая устраняет такую проблему?
ОБНОВЛЕНИЕ: Когда я начал получать ответы, я понял, что мне нужно немного прояснить ситуацию.
«try/catch/finally» - это излишество - я их никогда не буду использовать. У них есть серьезная штрафная сила при уловах(), они прикручивают функцию «Редактировать и продолжить» в Visual Studio, и они просто выглядят уродливыми.
Idealy Мне нужно, чтобы иметь возможность получить доступ к локальным переменным в методе Update() из любого кода, я решаю добавить в конце методы,
Когда я писал этот вопрос, я уже имел ответ - вложенность. У моего второго примера кода нет возвратов, и поэтому я могу добавить код в самую нижнюю часть метода, и он будет работать в 100% случаев, тогда как я смогу использовать локальные переменные. Вложенность плохая, хотя, и именно поэтому я здесь ищу решение BETTER.
UPDATE 2: Я был на самом деле ошибся try/catch
, потому что я не знаю, что вы можете пропустить catch
вместе это штрафы производительности и только finally
. Тем не менее, это решение по-прежнему хуже, чем решение для размещения в этом вопросе, потому что в недавно добавленном блоке finally
вы больше не можете использовать операторы return
. Таким образом, в основном вы можете делать все, что захотите, когда пишете метод в первый раз, но как только вы его продлеваете - вы вернетесь в гнездование.
попытка/наконец или (если применимо) Задача продолжения ... –
Я предполагаю, что вы ищете событие «onReturn» или «beforeReturn», чтобы подписаться? Я бы пошел с Try/Catch/Наконец, хотя. В зависимости от вашей обработки ошибок – DarthJam
«finally» не работает без «try». С другой стороны, покрытие всего метода в 'try' может привести к невероятно странному поведению, поскольку ошибки будут пропущены. Более того, попытка не может использоваться в сборках релизов из-за причин производительности (я знаю, что штраф происходит только тогда, когда ошибка поймана), за исключением особых случаев. Не понял, что вы делаете с помощью «Продолжения задачи», хотя ... – cubrman