【问题标题】:Is there a way to tell the compiler to put a block of code somewhere?有没有办法告诉编译器在某处放置一段代码?
【发布时间】:2011-10-03 14:42:11
【问题描述】:

我有一个很长的方法,为了阅读清楚,我想把一些代码放在一个单独的方法中。但是,这无法完成,因为该代码使用方法中的变量。所以我想把那个代码放在别的地方,并告诉编译器在编译时把那个代码插入“这个”地方。有没有办法做到这一点? 我正在使用视觉工作室。

【问题讨论】:

  • 如果它这么长,它可能无论如何都不应该是一种方法 - 将它拆分可能是您的最佳选择。
  • 请注意,您提出的问题和您遇到的问题是两件不同的事情。您的问题是代码复杂性。太长了,做的太多了。您收到的答案不是回答您提出的实际问题,而是回答您面临的实际问题。

标签: c# visual-studio


【解决方案1】:

听起来您在描述Extract method,您可以很容易地做到这一点,只需突出显示您要移动的代码,然后:

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

Visual Studio 将为您处理剩下的事情。阅读文档here

【讨论】:

  • 不起作用。无法访问原始方法的局部变量。
  • 你真的试过了吗? VS 会自动传递它们并返回或通过 ref 传递
  • @ispiro :重构将移动或ref您的本地变量。你有没有尝试过?
  • 嗯...但是这样做只会使水浑浊,我想不出任何理由这样做吗?
  • @ispiro - 你想做的事没有任何意义。
【解决方案2】:

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

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

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

现在在 Visual Studio 中,编辑器可以让您将该区域折叠成一行,上面写着“Frobbing code”。

【讨论】:

  • a) Region 的做法实际上是我到现在为止的做法。感谢您的回答(当时赞成)。
  • b) 我需要一个关于不同主题的决胜局,并且看到您致力于开发 C# 本身,所以如果您同意,这里是:(在单独的评论中,因为它太长了)
  • 当程序中不再引用包含的控件时,Controls.Clear() 会泄漏吗?根据 Hans Passant here(最后。在评论中),它会的。根据约翰桑德斯的说法,在上面的链接和here(在评论中),它不会。提前致谢。
  • @ispiro:我一点也不知道。我的建议是(1)尝试一下,看看会发生什么。为什么要相信任何人的话?自己试一试,你就知道了。 (2) 如果由于某种原因这不起作用,请提出一个新问题。
【解决方案3】:

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

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
    }
}

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

    public void MethodThatIsntDoingTooMuch()
    {
        bigSomethingDoer.Do();
    }
}

class BigSomethingDoer
{
    // shared locals are fields instead

    public void Do() 
    {
        // refactor long method into smaller methods
        // shared locals are promoted to class fields
        // this smaller class only does this one thing
        // --> its state does not pollute another class
    }
}

【讨论】:

    【解决方案4】:

    你问的问题可能可以用宏来完成,但如果代码太多且不可读,你应该考虑重构它并创建另一个方法,它接受你在主方法中作为参数的那些变量。

    一些重构工具具有 extract-method 等功能,您可以在其中选择一些代码,然后将其移至另一种方法。我猜 ReSharper 和 DevExpress CodeRush 都有这个功能,但我不是 100% 确定,我现在没有安装任何一个来尝试这个。

    【讨论】:

    • 您可能是这个意思,但我认为您的回答并不清楚:C# 中没有宏。
    【解决方案5】:

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

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

    【讨论】:

    • 您可以访问包含方法的变量,但您必须在其中定义 lambda,在 OP 想要的方向上没有任何收获。
    猜你喜欢
    • 2020-12-29
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2020-10-27
    • 2011-06-05
    相关资源
    最近更新 更多