2016-03-05 3 views
5

Один из комментариев по этой теме: Checking condition and calling continuous method with periods of delay unity, сказал, что:C# Почему я не должен использовать сопрограммы?

Никогда никогда никогда не использовать сопрограммы. Они учат вредным привычкам с точки зрения разработчика C# и ведут к линчеванию, если вы выполняете обычную работу C#

Мой вопрос: почему это? Это только в Единстве или вообще? Официальные образцы виртуальной реальности Unity https://www.assetstore.unity3d.com/en/#!/content/51519 используют их очень сильно (особенно пример флаера) вместо Invoke или Invoke Repeating, эти примеры проектов также были выпущены недавно.

+0

Привет, Мартин, дополнительно к объяснению Кори, довольно просто *** для начинающих *** в 99% случаев единственная причина, по которой человек использует сопрограмму, - это невероятно просто, что *** они не понимают, что есть Invoke и InvokeRepeating call *** или, во-вторых, что *** они просто не знают о вызове Update *** в Unity. это честно просто так просто. Обратите внимание, что (если вы эксперт) вы *** должны *** использовать Invoke/Repeating, где это необходимо, и вы полностью понимаете, что Update и Coroutine *** - это то же самое ***. – Fattie

+0

Чтобы сделать что-то похожее, это немного похоже на оператор «++» в c. (а) это ошеломляюще плохая идея, единственная худшая идея в разработке программного обеспечения (б) 1000 начинающих любителей, может быть, 2 имеет представление о том, что это значит, о различии между ++ а и ++ и других тонкостях (в) * обязательно *, иногда эксперты будут использовать его как своего рода сокращение, чтобы указать алгоритм или тому подобное. – Fattie

+0

(Вы упоминаете «образцы единства единства», все документы единства и образцы за пределами шутки, отраслевая легенда в бесполезности. Обратите также внимание на то, что это образец * виртуальной реальности *, ради блага: 99,999% от * новичка * вопросы, касающиеся to «coroutines!» выглядят следующим образом: http://stackoverflow.com/a/35807346/294884) – Fattie

ответ

7

Это очень вещь Единства, хотя совет применим в любом месте.

Разработчики не ожидают итерации IEnumerable, чтобы изменить состояние программы. Это не то, что IEnumerable предназначено для и является непоследовательным поведением со всеми .NET.

Что делает Unity, использует yield return как псевдо-сопрограмму, и это вызовет путаницу для любых разработчиков, незнакомых с этим.

В современном C# у нас есть async/await, чтобы выполнить то, что предназначено Unity, но Unity был сделан до того, как эта функция была доступна.

+1

Хотя очень легко построить сопрограмму с 'yield', как бы вы построили ее с помощью' async'/'wait '? Интересно, что [wiki] (https://en.wikipedia.org/wiki/Coroutine#Implementations_for_C.23) отображает шаблон 'yield' в виде полукоротингового шаблона, но не отображает' async'/'await'. – xanatos

+0

Cory, хотя все верно, помните, что Unity является системой на основе ECS-кадров; они «скручивают» все это немного, а не «переходить к следующему кадру». (Я не знаю, почему он существует, поскольку Update идентичен ... то есть доступ к следующему кадру, конечно, это удобно, но стоит ли это хаосом?) Вы, конечно, невероятно правы, что 99% людей думают «сопрограммы»! в Unity есть что-то делать с ** threading/timing/waiting **. Конечно, сопрограммы не имеют ничего общего с этими проблемами. – Fattie

Смежные вопросы