1

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

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

进一步编辑

汉斯建议了进一步的行为,为了复制这一点,我有以下几点:

我已经像这样添加了一个新ClassLibrary1Solution......

在此处输入图像描述

在控制台ConsoleSandpit中,我得到了以下内容,并引用了ClassLibrary1这样的...

在此处输入图像描述

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

4

3 回答 3

3

System.Console不是命名空间。 是命名空间中的类中ReadKey的共享方法ConsoleSystem

因此,以下语句的细分为:

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

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

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

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

于 2012-12-28T11:53:49.583 回答
1

1)您可以在控制台应用程序中通过许多功能做很多有用的事情,而无需或不需要实际与Console.

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

存在命名空间以帮助分离和组织功能。您可以选择隐藏这些分隔符(例如语句),这对应用Imports程序来说是有意义的——但我不希望所有用户都这样做。

于 2012-12-28T08:43:34.590 回答
1

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

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

并观察您的原始代码现在如何突然无法编译。还有一个严重迟钝的错误消息:“未为参数'等待'指定参数”。您可能会浪费数小时试图弄清楚为什么 Console.ReadKey() 需要等待参数。

于 2012-12-28T10:17:48.573 回答