为什么需要将Console命名空间导入Console应用程序项目

时间:2012-12-28 08:12:00

标签: vb.net visual-studio

如果我创建一个新的控制台应用程序,那么编译好了:

Module Module1

    Sub Main()
        Console.ReadKey()
    End Sub

End Module

另一种选择是:

Imports System.Console
Module Module1

    Sub Main()
        ReadKey()
    End Sub

End Module

现在明白的是,因为这是一个控制台应用程序,为什么这些项目不会以下列方式编译?:

Module Module1

    Sub Main()
        ReadKey()
    End Sub

End Module

换句话说:如果是控制台应用,为什么我需要导入控制台命名空间?

这与使用我winForms Me.someControl应用程序时的行为相同吗?虽然在那种情况下我可以离开Me但它仍然可以在不导入表单命名空间的情况下编译。

修改

Imports System.Console
Module Module1

    Sub Main()
        ReadKey()
        Console.ReadKey()  '<<adding namespace seems a bit pointless as I still need to specify Console
    End Sub

    Function ReadKey() As Boolean
        Return True
    End Function

End Module

进一步编辑

汉斯提出了进一步的行为并复制了这一点我有以下内容:

我已将ClassLibrary1添加到同一个Solution,就像这样......

enter image description here

在控制台ConsoleSandpit中我得到以下内容,并提及ClassLibrary1,如此......

enter image description here

...唯一的问题是我期待上面的编译错误,但似乎运行正常!

3 个答案:

答案 0 :(得分:2)

System.Console不是命名空间。 ReadKeyConsole类中的共享方法,位于System命名空间

因此,以下陈述的细分是:

System.Console.ReadKey()
  • System - 命名空间
  • Console - 班级
  • ReadKey - 共享方法

因此,当您调用Console.ReadKey()(未指定命名空间)时,通常需要在代码文件的顶部导入System。但是,这是不必要的,因为在VB.NET项目中,您可以指定为项目中的所有文件自动导入的默认命名空间列表。您可以使用项目属性设计器中的默认命名空间的检查列表来修改这些。除其他外,System会自动导入为所有项目模板的默认命名空间。

正如您在问题中所演示的那样,VB.NET中可以导入类或模块名称。 Imports语句不仅限于使用命名空间。但是,据我所知,没有办法使用项目的默认名称空间选项导入类名(或者至少不使用项目属性设计器)。

如果System.Console是命名空间,我同意您希望控制台项目的项目模板默认导入该命名空间。但是,因为它根本不是命名空间,所以你不会期望它这样做:)

答案 1 :(得分:1)

1)您可以在控制台应用程序中通过许多功能执行大量有用的操作,而无需或不需要实际与Console进行交互。

2)我可以很容易地想要编写一个名为ReadKey的函数,该函数根据用户输入(如果是其中一个键,按下两个或三个键之一)提示一个小提示,把它返还。否则,请指出错误并重新提示。为什么我必须为此函数选择不同的名称,因为我自己的命名空间已被Console中的方法自动污染?

存在命名空间以帮助分离和组织功能。您可以选择隐藏这些分色的选项(例如Imports语句),应用程序中的是有意义的 - 但我不会希望强制使用所有用户。

答案 2 :(得分:1)

将类库项目添加到您的解决方案并粘贴此代码:

Module FooBar
    Sub ReadKey(ByVal wait As Integer)
    End Sub
End Module

观察原始代码现在突然无法编译。还有一个严重钝的错误消息:“没有为参数'wait'指定参数”。您可能会失去小时的生活,试图找出为什么Console.ReadKey()需要等待参数。