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

さらに編集

Hans はさらなる動作を提案しており、これを再現するために次のようにしています。

ClassLibrary1同じSolutionように新しいものを追加しました...

ここに画像の説明を入力

コンソール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

クラス ライブラリ プロジェクトをソリューションに追加し、次のコードを貼り付けます。

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

そして、元のコードが突然コンパイルに失敗する様子を観察してください。非常に鈍いエラーメッセージも表示されます:「パラメーター「待機」に引数が指定されていません」。Console.ReadKey() が待機引数を必要とする理由を理解しようとして、何時間も無駄にする可能性があります。

于 2012-12-28T10:17:48.573 に答える
1

1)コンソールアプリケーション内で、多くの機能にわたって、実際にConsole.

ReadKey2)ユーザー入力に基づいて、2 つまたは 3 つのキーのうちの 1 つを押すように小さなプロンプトを表示する関数を書きたいと思うことは容易に想像できます。それ以外の場合は、エラーを示して再プロンプトを出します。自分の名前空間がからのメソッドで自動的に汚染されているため、この関数に別の名前を付ける必要があるのはなぜConsoleですか?

名前空間は、機能を分離して整理するために存在します。アプリケーション内Importsでこれらの分離を非表示にするオプション (ステートメントなど) が与えられますが、これをすべてのユーザーに強制することは望ましくありません。

于 2012-12-28T08:43:34.590 に答える