Visual Studio:是否存在“将类移动到其他名称空间”的重构?


71

我正在做一些架构清理,其中涉及将一堆类移到不同的项目和/或名称空间中。目前,我正在手动移动文件,构建文件,然后根据需要使用Foo语句手动添加文件以解决编译错误。有人知道这样做更聪明吗?(我们是一家CodeRush和Refactor!商店,但我很想知道Resharper是否对此提供支持)


36
现在,“重复”问题就指向此处。我的堆栈刚刚溢出...
yoyo 2014年


@Liam-我看不到骗子的答案。
rory.ap

@ rory.ap这些问题(在某个时候)被合并了
Liam

Answers:


29

如评论中所述,此答案现在已过时。请查看下面的最新答案


Resharper是我知道具有此功能的唯一工具。它还有许多其他功能,而CodeRush和Refactor则缺少这些功能!


2
在大多数情况下,我真的很喜欢DevExpress工具,但是移动文件的功能似乎是一个简单的功能,令我惊讶的是它的缺失。我一直想试一试Resharper,也许是时候...
Seth Petry-Johnson

1
ReSharper更清洁-不会在我的源代码中添加大量的彩色垃圾。
Dmitri Nesteruk

2
@dmitri-是的,它确实很吵,特别是当您像我这样同时运行两者时; p如果您感到不便,可以选择绘画。
Sky

当前答案不正确,对于VS 2019解决方案,请参见下面的
-Pac0

34

Visual Studio 2010可以重命名名称空间。将光标放在名称空间名称上,然后按F2。或者干脆码,并按其重命名Shift+ Alt+ F10Enter看到红色的波浪线出现之后。

Reharper还可以重命名名称空间。引用:

重命名命名空间重构,用户可以重命名一个特定的命名空间,并自动修正到代码中的命名空间的所有引用。以下用法已重命名:

  • 命名空间语句
  • 使用指令
  • 类型的合格名称

11
当您想将标识符移到名称空间时,这有什么帮助?
2010年

3
通过将类所在的名称空间重命名为新名称来@sbi吗?
伊戈尔·泽瓦卡

7
@Igor:再次阅读问题。oleks希望将名称空间划分为子名称空间。这意味着要NS::C移至NS::NS1::C。重命名空间可以做到吗?
2010年

11
@sbi-是的,可以。您可以在VS中创建新的名称空间(即,创建与新名称空间相对应的文件夹结构),然后将类型拖放到新文件夹中。Resharper现在会警告您,这些类型位于与它们的文件夹结构(即新名称空间)不对应的名称空间(旧名称空间)中。然后,它为您提供了更正它们的机会。这只会更新已移至新名称空间或子名称空间的类型。
罗布·莱文

1
我已经尝试过resharper,是的,正如Rob Levine所指出的那样-如果您的名称空间不适合文件夹结构,它会抱怨,并为您提供了解决该问题的选择。虽然这对于例如dll项目非常有效,但对于网站(在常规情况下,您的代码应位于App_Code目录中)却不是这样。它建议我创建一个命名空间App_Code.SomeNameSpace.SomSubNameSpace-不太好。
oleks 2010年

22

Visual Studio 2019提供至少2个内置选项:

可以在任何类上触发“移至名称空间...”重构,VS会提示您输入目标名称空间。

当前文件名称空间与文件夹结构不匹配时,提供“将名称空间更改为...”重构。

这可用于通过以下方式将各个类移动到不同的名称空间:

  1. 创建所需的文件夹结构
  2. 移动文件
  3. 应用提到的重构(使用光标在名称空间上的CTRL +。)

这些操作确保所有引用都相应更新。


移至名称空间不会更改引用。我没有“将名称空间更改为”,这是仅企业功能吗?我有专业。
user3285954 '19

3
我在VS社区中看到了这两个选项,“移动到名称空间”确实更新了引用
gschuager

2
移至名称空间确实会更新引用。它没有更新类的引用,而文件中的类型更多。我还注意到部分类根本不起作用。感谢您确认:)
user3285954 '19

3
这应该是当前接受的答案,因为它提供了使用当前版本VS的解决方案,而没有任何第三方解决方案。
阿图尔

Move to namespace...打开Quick Actions and Refactorings...菜单时,我是唯一一个看不见的人吗?我只有Generate constructor...Generate overrides...Extract Interface...。可能是重构仅适用于C#而不适用于VB ..可惜..
Ama

9

此答案至少适用于Visual Studio 2013和2015 ,无需重新共享

  1. 将课程文件移动到新文件夹
  2. 打开“查找并替换”
  3. 选择“替换为文件”
  4. 在“查找内容”字段中输入原始名称空间定义,例如。MyCorp.AppStuff.Api
  5. 在“替换为”字段中键入新的名称空间定义,例如。MyCorp.AppStuff.Api.Extensions
  6. 使用“查找范围”字段的浏览按钮选择新文件夹...,或键入文件夹路径
  7. 按下Replace All按钮

3
仅当您不将某些内容从一个名称空间(仍要使用)移至另一个名称空间时,此方法才有效。这基本上仅在您完全重命名名称空间时才有效。
Blackclaws

2
@Blackclaws我觉得第1步和第6步涵盖了这一点
Gusdor

啊,我明白你的意思。由于您只替换了该新文件夹,因此您不会更改该名称的所有提及。但是,由于使用该类的所有类都必须更新其using指令,因此它可能仍然使您迷惑许多未定义的引用。我真的希望他们已经实现了这样的功能。
Blackclaws

@Blackclaws也是我。我使用了Resharper,但我发现它变化太大
Gusdor

1
如果您在单个文件夹中混用了名称空间,请使用word开头的正则表达式进行匹配namespace
Dzmitry Lahoda

5

VS 2015和VS 2017有部分解决方案,无需使用免费扩展程序Resharper

我今天喜欢(2017年底)的一个扩展是Fix Namespace VS Extension:https : //marketplace.visualstudio.com/items?itemName= vs-publisher-599079.FixNamespace# overview

它分析解决方案的文件夹结构,并使用该结构提供名称空间重构。不幸的是,它并不是完美的:它不能很好地跟踪依赖关系,但却为我解决了大部分工作。



1

由于提供了以上答案(我猜是这样),所以此功能已添加到CodeRush中。只需将克拉放在要移动的类型上,您就会在“重构”上看到“将类型移动到名称空间”选项!上下文菜单。这会将类型移动到新的名称空间并更新引用。但是,您可能仍希望将文件移动到与名称空间名称匹配的解决方案文件夹中。


3
在Visual Studio 2013专业版中不存在。您是否在偶然使用Resharper?
yoyo 2014年

1
我指的是CodeRush / Refactor!上下文菜单,而不是Visual Studio。
nzduck 2014年

3
啊,对不起,一开始并没有意识到。由于股票Visual Studio确实具有“重构”功能(不是说它非常强大或任何功能,所以可以编辑答案以弄清楚):-P...。
2014年

2
我不明白为什么VS没有这样的功能。他们是否已经在JetBrains上睡觉了?
路加福音

0

这不是最好的结果,但是无需插件或工具即可完成,只能使用Visual Studio。在整个解决方案中查找和替换,区分大小写,匹配整个单词。查找内容:类名,替换为:New.Namespace.ClassName(完全限定的类名)。

如果您在旧名称空间中拥有100多个引用的移动类和其他类的引用,那么不会被移动,这是我找到的唯一安全且免费的解决方案。导致错误的唯一情况是在其他名称空间中具有相同的类名。


-1

如果您不能或不想使用Re $ harper,Notepad ++是您的朋友:

  1. 确保您没有在Visual Studio中对要移至新名称空间所需的文件进行更改
  2. 打开所有包含在记事本++中需要更改名称空间的文件
  3. 开启Find & Replace(CTRL + H)
  4. 填写查找内容并替换为字段
  5. Replace All in All Opened Documents
  6. 保存所有文档中的所有更改(CTRL + SHIFT + S)
  7. 切换到Visual Studio并重新加载所有文档(Yes to all在提示时)

完成


当我已经在Visual Studio中拥有可在整个解决方案中使用查找和替换功能的文件时,为什么要在Notepad ++或任何编辑器中打开文件?该解决方案的另一个问题是,它将使用相同名称空间中其他类可能需要的内容进行更改。
user3285954

一点也不,因为你可以替换namespace A.B.C使用namespace X.Y.Z,而不影响using秒。该解决方案是有效的,即使您可以使用Visual Studio来实现,我也不记得为什么2年前我提出了这个解决方案。无论如何,不​​赞成投票似乎是一种激进的做法,因为这个答案既没有误导也不危险。
塞尔吉奥

假设您在名称空间Foo.Bar中具有类A和B,并且A移至Foo.Baz。如果我理解正确,则您的建议是将“ using Foo.Bar”替换为“ using Foo.Baz”。替换的结果是将找不到类B,因此必须手动添加“ using Foo.Bar”,因此替换无法解决避免手动更新的问题。
user3285954 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.