如果我创建一个新的控制台应用程序,那么编译好了:
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
,就像这样......
在控制台ConsoleSandpit
中我得到以下内容,并提及ClassLibrary1
,如此......
...唯一的问题是我期待上面的编译错误,但似乎运行正常!
答案 0 :(得分:2)
System.Console
不是命名空间。 ReadKey
是Console
类中的共享方法,位于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()需要等待参数。