Простое заявление C # Noop - PullRequest
37 голосов
/ 03 августа 2011

Что такое простой оператор Noop в C #, который не требует реализации метода? (Впрочем, методы Inline / Lambda в порядке.)

Мой текущий вариант использования: я хочу занять блок catch для try-catch, чтобы я мог войти в него при отладке и проверить исключение.
Я знаю, что в любом случае, вероятно, мне следует обработать / записать исключение, но смысл этого упражнения не в этом.

Ответы [ 15 ]

3 голосов
/ 03 августа 2011

Ну, NOP в C # существует, как и в C, и равен ';', и его правильное определение - " пустой оператор ", но для использования, которое вы намереваетесь, достаточно поставить точку останова закрывающая скоба ... Нет необходимости в сохранении живой анимации, поскольку время жизни ссылки на объект в методе продлевается до конца метода, когда подключен отладчик. Так что вам просто нужно написать

catch(Exception exception)
{
}

и поставьте точку останова на закрывающую скобку и просмотрите содержимое исключения.

2 голосов
/ 03 августа 2011

Вы пытаетесь отладить релизную (оптимизированную) сборку? Обычно оптимизатор удаляет переменные без ссылок и пустые блоки.

Два решения:

  • Отладка в отладочной сборке.
  • Установите точку останова на самом catch и используйте $exception - созданный отладчиком для ссылки на исключение в полете - в окне инструмента Locals.
1 голос
/ 30 января 2019

Это дополнение к ответу @AHM, так как я хотел простой способ сделать NOOP для целей отладки (связываясь с AB PLC CompactLogix и столкнулся с ошибками, которые действительно видны только в Disassembly из-за импорта DLL библиотеки C ++ в C #).

Я взял однострочник

((Action)(() => { }))();

и поместил его в фрагмент с именем noop.snippet , затем поместил его в папку с именемМои фрагменты кода.
( Инструменты -> Диспетчер фрагментов кода -> Расположение ) ИЛИ Аккорд ( Ctrl + K, Ctrl + B )

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>noop</Title>
            <Shortcut>noop</Shortcut>
            <Description>Code snippet to inject an assembly (x86) equivalent of the NOOP command into the code's disassembly.</Description>
            <Author>Jay Whaley</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Code Language="csharp">
            <![CDATA[// Forces a psuedo NOOP in disassembly
                ((Action)(() => { }))();
            $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Это помогает быстро использовать ярлык на случай, если низкоуровневая связь становится запутанной, и требует, чтобы это была обычная тактика отладки.Фактическая сгенерированная сборка выглядит следующим образом, но есть некоторые сообщения о том, как использовать фактическая сборка inline в C #.

Disassembly generated from invoking a nameless action

0 голосов
/ 19 июля 2017

Надежное решение

try
{
   blablablablaStatemnt();
}
catch(Exception ex)
{
    #IF DEBUG
       Debugger.Break();
    #END IF
}

Так просто!

В противном случае

контрольные точки

может быть очень полезным;

0 голосов
/ 03 августа 2011

Мне это очень нравится, просто потому, что это смущает любого, кто с ним сталкивается:

catch (SomeException e)
{
    lock(e);
} 
...