C# 有没有办法告诉编译器把代码块放在某个地方?

C# 有没有办法告诉编译器把代码块放在某个地方?,c#,visual-studio,C#,Visual Studio,我有一个很长的方法,为了阅读的清晰,我想把一些代码放在一个单独的方法中。但是,这无法完成,因为该代码使用方法中的变量。因此,我想把代码放在其他地方,并告诉编译器在编译时将代码插入“this”位置。有办法吗? 我使用的是visual studio。听起来像是在描述,您可以非常轻松地完成此操作,只需突出显示要移动的代码,然后: 右键单击->重构->提取方法->输入方法名称 Visual studio将为您处理其余的问题。阅读文档。您可以使用匿名方法/lambda创建可以访问包含方法的局部变量的函数

我有一个很长的方法,为了阅读的清晰,我想把一些代码放在一个单独的方法中。但是,这无法完成,因为该代码使用方法中的变量。因此,我想把代码放在其他地方,并告诉编译器在编译时将代码插入“this”位置。有办法吗?
我使用的是visual studio。

听起来像是在描述,您可以非常轻松地完成此操作,只需突出显示要移动的代码,然后:

右键单击->重构->提取方法->输入方法名称


Visual studio将为您处理其余的问题。阅读文档。

您可以使用匿名方法/lambda创建可以访问包含方法的局部变量的函数


但这样长的方法通常是不必要的。尝试解耦方法的不同部分,这样它们就不需要共享公共的局部变量。

< p>很好,你可以用宏来做,但是如果代码太多,不可读,你应该考虑重构它,并创建另一种方法,将主方法中的变量作为参数。
一些重构工具有一些特性,比如提取方法,您可以在其中选择一些代码,然后将这些代码移到另一种方法。我猜ReSharper和DevExpress CodeRush都有这个功能,但我不是100%确定,而且我现在还没有安装任何一个来尝试这个功能。

如果您有一个长方法,因为需要访问相同的局部变量而无法拆分,那么您真正拥有的是另一个尚未正式创建到类中的对象。重构代码,将方法和共享状态提取到自己的类中,然后开始将方法重构为更小、更易于管理的部分

class SomeClass
{
    // whatever shared state of the class     
    // whatever methods of the class

    public void MethodThatsDoingTooMuch()
    {
         // long method
         // hard to split the method because of locals
    }
}


正如其他人所说,您首先遇到的问题是更大的代码组织问题的症状。理想情况下,您的方法应该非常短,并且变量非常少,这样您就不需要将它们的大部分代码移到其他地方。正确的做法可能是将部分代码提取到它们自己的方法中,每个方法都执行一项任务,并且做得很好

作为权宜之计,您可以使用代码区域来帮助组织代码:

void BigMethod()
{
    #region Frobbing code
        FrobTheBlob();
        // blah blah blah
        // blah blah blah
    #endregion
    ...

现在在VisualStudio中,编辑器将允许您将该区域向下折叠成一行,上面写着“跳转代码”

如果有那么长,它可能不应该是一种方法——把它分开可能是你最好的选择。注意,你问的问题和你遇到的问题是两件不同的事情。您的问题是代码复杂性。太长了,做的太多了。你收到的答案并不是在回答你所问的问题,而是在回答你所面临的问题。无法访问原始方法的局部变量。您确实尝试过吗?VS将自动通过它们并返回或通过ref@ispiro:重构将移动或
ref
您的本地变量。你尝试过什么吗?嗯……但是这样做只会弄脏水,我想不出任何理由这样做?@ispiro-你想做的没有任何意义。你可以访问包含方法的变量,但你必须定义其中的lambda,在OP想要的方向上没有任何收益。你可能是这么想的,但我想从你的回答中还不清楚:C#a)中没有宏。
区域实际上是我到目前为止所做的。谢谢你的回答(当时投了赞成票)。b)我需要一个不同主题的平局打破者,并且看到你正在开发C#本身,所以如果你同意的话,这里是:(在单独的注释中,因为它太长)当程序中不再引用包含的控件时,
Controls.Clear()
会泄漏吗?根据汉斯·帕桑(Hans Passant)(最后,在一篇评论中)的说法,它会。根据约翰·桑德斯(JohnSaunders)的说法,无论是在上面的链接中还是在评论中,都不会。提前谢谢。@ispiro:我一点儿也不知道。我的建议是(1)试试看会发生什么。为什么要相信别人的话?你自己试试,你就会知道了。(2)如果出于某种原因,这不起作用,那就提出一个新问题。
void BigMethod()
{
    #region Frobbing code
        FrobTheBlob();
        // blah blah blah
        // blah blah blah
    #endregion
    ...