有没有一种方法可以在VB中跳出根命名空间?

13
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Text.MyCustom mc = new System.Text.MyCustom();  
        }
    }
}

namespace System.Text
{
    public class MyCustom { }
}

如果我的应用程序有根命名空间,我该如何在VB中实现此操作?这可能吗?

更新: 根据答案,我认为没有办法实现这一点。 我向Microsoft Connect发布了一个功能建议:请投票


2
你必须删除应用程序的根命名空间才能实现这一点。唯一的方法是删除根命名空间,并在代码中明确设置命名空间。在C#项目中,你没有根命名空间,只有默认命名空间,这正是你在这里所要求的。很抱歉,这是VB.NET和C#之间的差异之一。 - awe
2
敬畏:这应该是下面的答案。 - Colin
5个回答

14

在 VS 2012 的 VB.NET 中,这个老问题被修复了。从这个版本开始,你可以使用前导 global 转义根命名空间。以下代码在 VS 2010 中存在错误,在 VS 2012 中是正确的:

Imports Tools

Module Module1
    Sub Main()
        SayHello()
    End Sub
End Module

Namespace Global.Tools
    Module TestModule
        Sub SayHello()
            Console.Out.WriteLine("Hello")
        End Sub
    End Module
End Namespace

1
这是我在connect上的建议,我为它毕业感到非常自豪!! - Shimmy Weitzhandler

5

我认为悲伤的事实是你不能这样做。命名空间附加到根命名空间。 文档 没有提供任何转义机制的提示。有一条关于使用 Global 关键字的注释与命名空间有关,但我认为该部分文字讨论如何引用命名空间而不是如何声明它们。


1

0

在VB.NET中设置命名空间与C#中声明命名空间几乎相同,只不过采用VB.NET语法!但不幸的是,根命名空间始终存在,因此任何新声明的命名空间都将位于根命名空间内。

Namespace ConsoleApplication1
  Class Program
    Private Shared Sub Main(ByVal args As String())
        Dim mc As New System.Text.MyCustom()
    End Sub
  End Class
End Namespace

Namespace System.Text
  Public Class MyCustom
  End Class
End Namespace

如果根命名空间是Test,则上述代码将给您以下结果。

Test.ConsoleApplication1
Test.System.Text


谢谢大家的评论,我在讨论内存问题!


1
尝试运行你所写的代码,然后进入对象浏览器查看它。 - Shimmy Weitzhandler
1
它被添加到ConsoleApllication1.System.Text中,不像在C#中。 当然,我可以将根命名空间设置为null,但这不是我想要的。 - Shimmy Weitzhandler
1
此外,根据上面的例子,我猜测Program类位于命名空间ConsoleApplication1.ConsoleApplication1中(虽然我没有vb.net环境来验证它)。 - Fredrik Mörk

0
在VB项目的项目属性中,您可以更改根命名空间。默认情况下,它与项目名称相同,但您可以将其删除,然后在代码中完全掌握命名空间结构。缺点是您必须在需要它的代码的每个地方指定项目名称作为命名空间...
对于C#项目,在项目属性中类似的设置仅为默认命名空间,如果您在代码中指定命名空间,则会覆盖它。对于VB项目,它指定了顶级命名空间,而不是默认命名空间...

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