简单的C# Noop语句

59

在C#中,什么是简单的Noop语句,它不需要实现一个方法?(内联/lambda方法可行)

我的当前用例:我想占用try-catch的catch块,以便在调试时可以进入该块并检查异常。
我知道我应该处理/记录异常,但这不是本练习的重点。


5
你能不能把断点放在 catch 块的右括号 } 上? - George Duckett
2
如果你想查看异常,你也可以在 catch (...) 处打断点并单步执行。 - porges
17
@Protector:也许执行流程已经超出了 } 的边缘。你可以尝试使用 catch (Exception e) {{{{{{{{{{ }}}}}}}}}} 来更紧密地控制。 - porges
4
@Protector one,您正在使用发布版还是调试版?在发布版中,catch (Exception e) {} 会被简化为 catch {} - Jonathan Dickinson
2
@RLH,现代应用程序中不应使用NO-OP进行定时。这种模式与多任务处理或移动硬件不兼容(它们会占用其他应用程序无法使用的CPU时间,并导致更高的CPU利用率,浪费电池电力)。 - BrainSlugs83
显示剩余10条评论
18个回答

4
为什么要过度设计呢?
var x = 0;

运作得非常好 :)


1
这也是我的直觉,但是Visual Studio会在此方法上抛出警告,因为变量未使用。最终我使用了@blueberryfields的分号技巧 => ; //noop - Timothy Lee Russell
每次我这样做时,我总是在它后面添加 x++;。我想确保编译器不会将其清除。 - Chris Marisic

3
许多出色的解决方案!我的首选是:

_ = "";

当您想确认有返回值,但不需要或不想使用时,可以使用_。它可以使编译器安静下来,不会提示您未获取返回值。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

3

您是否试图调试一个发布(优化)版本的构建?通常是优化器删除未引用的变量和空块。

有两种解决方案:

  • 在调试构建中进行调试。
  • catch本身上设置断点,并在Locals工具窗口中使用由调试器创建的$exception来引用正在执行的异常。

啊,局部变量窗口的技巧很不错!至少解决了我的当前问题。 - Protector one
起初我并不理解你所说的“在调试版本中进行调试”的意思,但这确实是我应该做的事情。 - Protector one

3

在C#中,NOP(无操作)与C语言中一样,表示为';',其正确定义是“空语句”,但是对于你想要的用法,只需要在catch的右括号处设置断点即可。由于调试器附加时方法中对象引用的生命周期延长到方法的结尾,因此无需保持任何东西的活动状态。所以你只需要编写:

catch(Exception exception)
{
}

在闭合括号上设置断点,并查看异常内容。


实际上,这两种解决方案似乎都对我不起作用!如果我使用;,Visual Studio会自动跳过它。 - Protector one
@Protector,应该在“}”处跳过断点,这样可以满足您的需求。 - Felice Pollano
1
我不会真的把 ; 称作 nop。nop 是什么都不做的东西,但是单独的 ; 根本什么也不是 :) - porges
@Porges 你是对的,它被定义为“空语句”。 - Felice Pollano
可以用,断点到达代码块的结尾,调试器在那里停止。 - Markus

1
这是对@AHM答案的补充,因为我想找到一种简单的方法来进行NOOP以进行调试(与AB PLC CompactLogix通信并遇到仅在Disassembly中真正可见的C ++库DLL导入错误,因此需要进行调试)。
我采用了这个一行代码。
((Action)(() => { }))();

将其放入名为noop.snippet的片段中,然后将其放置在名为My Code Snippets的文件夹中。
(工具->代码片段管理器->位置) 或和弦 (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>

这有助于使其成为一种快速使用的快捷方式,以防低级通信变得混乱并需要将其作为常见的调试策略。生成的实际汇编代码如下,但有关如何在C#中内联使用实际汇编的一些帖子

Disassembly generated from invoking a nameless action


0

这是我在为单元测试编写一些“虚拟对象”时所做的事情,其中一些方法需要保留为空白。


public void SetToken(string token)
{
    // Method intentionally left empty
}

我按照智能感知提示得到了上述结果。我的开发环境是Visual Studio 2022。


0

可靠的解决方案

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

就这么简单!

否则

断点

非常有用;


-3

我非常喜欢这个,因为它会让遇到它的人感到困惑:

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

5
谁来维护这个代码时,会惊叹于你的创造力和独创性。但说实话,用晦涩难懂的代码来困扰人并不是好的做法。现今我们正试图通过易读性强的编码方式摆脱这种情况。 - Grant Thomas
2
@GrantThomas 很确定他是在幽默。 - MasterMastic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接