Member 13569650 Ответов: 3

Из-за ограниченной области goto C# мне нужен способ входа в цикл iner во вложенных циклах for


У меня есть приложение, написанное на c++ mfc, которое я перенес на c#.

в этом приложении mfc у меня есть много вложенных циклов for следующим образом:
getSeries()
{

  if (flag == pass) goto ep;

  for i1 ...
    ...
    for i2 ...
      ...
      for i3 ...
        ...
        for i4 ...
          .
          .
          .
             for ...
             {
               ...
               return;
               ep;
             }
           }
         }
     }//last for

}// end of getSeries()

это прекрасно работает в c++ mfc

но в c# не будет компилироваться из-за области goto

Может ли кто-нибудь помочь в этом

Спасибо Вам за любую помощь

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

Мне нетрудно что-то попробовать.

3 Ответов

Рейтинг:
2

OriginalGriff

В принципе, не используйте goto вообще.

Если код, который вы использовали, является C++ и использует goto тогда это, скорее всего, плохо спроектировано - вложение 5 глубоких циклов-плохой знак, но попытка "прыгнуть" в середину цикла-плохая идея и признак того, что исходный код был переведен с более раннего языка, возможно, даже ассемблерного кода.

C# имеет объем на goto ярлыки, чтобы сделать такой код невозможным: вы можете использовать только goto чтобы достичь метки в той же области или области "более высокого уровня", в которую встроен ток. Это сделано специально, чтобы предотвратить осложнения, которые могут вызвать такие скачки, и спагетти-код, который из них вытекает.

Я бы посоветовал вам взглянуть на исходный код, понять, что он делает, и разработать современный код C#, который не требует goto вообще. Я использую C с 80 - х годов, C++ с 90-х годов и C# с 00-х годов-и ни разу мне не приходилось использовать a goto в реальном коде!


Maciej Los

5ed!

Member 13569650

ваш комментарий мне известен.
и спасибо Вам за то, что вы мне это сказали.

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

мое приложение mfc было построено в 2006 году
и обновлен в 2020 году с помощью tchar.h
все приложение составлено из методов и хорошо организовано.

во всех моих приложениях у меня есть этот сингл
идти к
Я много раз тестировал свое приложение
и его работа фантастическая.

l теперь я нахожусь в состоянии перестроить свои методы приложения таким образом, чтобы
убрать этот переход.

Большое спасибо!.

OriginalGriff

Нет, вся идея в том, что вы не пишете такой код - во всяком случае, с шестидесятых годов! :смеяться:
Проблема заключается в обслуживании - код, который прыгает в циклы, трудно изменить, трудно исправить: как вы уже видели, когда вы пытаетесь перевести его на C#.
Причем поддерживающая фаза разработки длится на порядки дольше, чем первоначальная фаза "кодирования".
Если вы все еще используете goto в современных структурированных языках, основанных на OOPs, таких как C# и C++ (черт возьми, даже в C!), то это подразумевает отсутствие понимания того, что такое структурированный дизайн и принципы OOPs. Просто потому, что вы *можете* что-то сделать, это не значит, что вы *должны*

Я не могу вспомнить ни одной компании, в которой я работал или выполнял работу за последние тридцать лет, где такой код имел бы хоть какой-то шанс пройти проверку кода!

Member 13569650

Я с тобой не согласен.

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

Скажем вы хотите написать заявление
которые используют структурированный алгоритм
во вложенных циклах (скажем, вы не нашли алгоритм не вложенных циклов)

у вас есть 2 варианта.

1 продолжайте искать алгоритм не вложенных циклов независимо от того как долго
это займет много времени.

2 Используйте goto . и продолжайте поиски.

Я выбираю вариант 2.

Примечание: приложение должно проверять каждый
алгоритм цикла и если проверка
это нормально, что мы перестаем ездить на велосипеде.
а также мы не можем спасти и тогда
езда на велосипеде потому что это большие циклы

спасибо

OriginalGriff

Вы можете не соглашаться, но я почти уверен, что я на стороне большинства здесь! :смеяться:

Давайте посмотрим: я отправил код в гостиную и попросил комментарии:

https://www.codeproject.com/Messages/5754427/Would-this-pass-code-review-where-you-are

OriginalGriff

Ваше пересмотренное описание добавляет Это:
"Примечание: приложение должно проверять каждый
алгоритм цикла и если проверка
это нормально, что мы перестаем ездить на велосипеде.
а также мы не можем спасти и тогда
езда на велосипеде потому что это большие циклы"

Это еще хуже, потому что вы ожидаете, что значения локальных переменных будут сохранены от вызова к вызову (или вы используете все "глобальные" переменные), а этого просто не произойдет!
Есть гораздо лучшие, более современные способы "приостановить обработку и возобновить позже", такие как IEnumerables, Yield returns и так далее:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield

Вместо того чтобы цепляться за "это сработало так, поэтому я сделаю это так", прочитайте то, что я сказал ранее: "я бы предложил вам посмотреть на исходный код, понять, что он делает, и разработать современный код C#, который вообще не требует goto."

Member 13569650

Мольбы не забывайте об этом
оригинальное приложение завершено
и работает фантастически
с 2006 года и проверено
много много раз по тысяче
раз и всегда отдавай
правильный выход.

моя единственная проблема-это переезд
это к с#

Рейтинг:
1

CPallini

Даже в C++ такой код это некрасиво и то goto возможно, неоправданно. Вероятно, есть лучшие способы реализовать ваш алгоритм, но без просмотра фактического кода я не могу помочь дальше.


Maciej Los

5ed!

CPallini

Спасибо тебе, Мацей!

Рейтинг:
1

GenJerDan

Это, по сути, то, что вы хотите, чтобы произошло? Гото не нужно.

getSeries()
{

  if (flag == pass) 
   {
     ep;
   }
else
   {
    for i1 ...
      ...
      for i2 ...
        ...
        for i3 ...
          ...
          for i4 ...
          .
          .
          .
            for ...
             {
               ...
               return;
               ep;
             }
           }
         }
     }  //didn't count braces, may not match up

}// end of getSeries()


Member 13569650

да
но в другом варианте
Я хочу быть в самой замкнутой петле
потому что там у меня есть вход
из алгоритма

Maciej Los

- Сомневаюсь. Этот:

if (flag == pass) 
{
  ep;
}
else
{
...
}


можно укоротить этот путь:
if (flag == pass) return; // ;)

Member 13569650

Привет дискуссия здесь заставляет меня
вынужден искать решение.

Я изменил некоторые методы
и добавьте некоторые манипулируемые методы.

и поместите их в самую инерционную петлю

большое вам спасибо за то, что сделали
меня заставят дотянуться
это решение.

спасибо