インポート宣言: open キーワードImport declarations: The open keyword

インポート宣言は、完全修飾名を使用せずに参照できる要素を持つモジュールまたは名前空間を指定します。An import declaration specifies a module or namespace whose elements you can reference without using a fully qualified name.

構文Syntax

open module-or-namespace-name

解説Remarks

常に完全修飾名前空間またはモジュールパスを使用してコードを参照すると、書き込み、読み取り、および保守が困難なコードを作成できます。Referencing code by using the fully qualified namespace or module path every time can create code that is hard to write, read, and maintain. 代わりに、 open 頻繁に使用されるモジュールと名前空間にキーワードを使用して、そのモジュールまたは名前空間のメンバーを参照するときに、完全修飾名の代わりに短い形式の名前を使用できます。Instead, you can use the open keyword for frequently used modules and namespaces so that when you reference a member of that module or namespace, you can use the short form of the name instead of the fully qualified name. このキーワードは、C# の using キーワード、 using namespace Visual C++、Visual Basic に似てい Imports ます。This keyword is similar to the using keyword in C#, using namespace in Visual C++, and Imports in Visual Basic.

指定されたモジュールまたは名前空間は、同じプロジェクトまたは参照されるプロジェクトまたはアセンブリ内に存在する必要があります。The module or namespace provided must be in the same project or in a referenced project or assembly. そうでない場合は、プロジェクトへの参照を追加するか、 -reference コマンドラインオプション (またはその省略形) を使用することができ -r ます。If it is not, you can add a reference to the project, or use the -reference command-line option (or its abbreviation, -r). 詳細については、「コンパイラ オプション」を参照してください。For more information, see Compiler Options.

インポート宣言は、外側の名前空間、モジュール、またはファイルの末尾まで、宣言の後のコードで名前を使用できるようにします。The import declaration makes the names available in the code that follows the declaration, up to the end of the enclosing namespace, module, or file.

複数のインポート宣言を使用する場合は、別々の行に表示する必要があります。When you use multiple import declarations, they should appear on separate lines.

次のコードは、キーワードを使用して open コードを簡略化する方法を示しています。The following code shows the use of the open keyword to simplify code.

// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
  let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
  let writer = new System.IO.StreamWriter(stream1)
  writer.WriteLine(text)

// Open a .NET Framework namespace.
open System.IO

// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
  let stream1 = new FileStream(filename, FileMode.Create)
  let writer = new StreamWriter(stream1)
  writer.WriteLine(text)

writeToFile2 "file1.txt" "Testing..."

F # コンパイラは、同じ名前が複数の開いているモジュールまたは名前空間で発生した場合に、あいまいさが発生した場合にエラーまたは警告を生成しません。The F# compiler does not emit an error or warning when ambiguities occur when the same name occurs in more than one open module or namespace. あいまいさが発生すると、F # は、最近開いたモジュールまたは名前空間を優先します。When ambiguities occur, F# gives preference to the more recently opened module or namespace. たとえば、次のコードでは、 empty Seq.empty との empty 両方のモジュールにがある場合でも、はを意味し List Seq ます。For example, in the following code, empty means Seq.empty, even though empty is located in both the List and Seq modules.

open List
open Seq
printfn "%A" empty

したがって、同じ名前を持つメンバーが含まれているモジュールまたは名前空間を開く場合は注意が必要です。 List Seq 代わりに、修飾名の使用を検討してください。Therefore, be careful when you open modules or namespaces such as List or Seq that contain members that have identical names; instead, consider using the qualified names. コードがインポート宣言の順序に依存している状況を避ける必要があります。You should avoid any situation in which the code is dependent upon the order of the import declarations.

既定で開かれている名前空間Namespaces That Are Open by Default

一部の名前空間は、明示的なインポート宣言がなくても暗黙的に開かれる F # コードでよく使用されます。Some namespaces are so frequently used in F# code that they are opened implicitly without the need of an explicit import declaration. 次の表は、既定で開かれている名前空間を示しています。The following table shows the namespaces that are open by default.

名前空間Namespace 説明Description
FSharp.Core やなどの組み込み型の基本的な F # 型定義が含まれてい int float ます。Contains basic F# type definitions for built-in types such as int and float.
FSharp.Core.Operators やなどの基本的な算術演算が含まれてい + * ます。Contains basic arithmetic operations such as + and *.
FSharp.Collections やなどの変更できないコレクションクラスが含まれてい List Array ます。Contains immutable collection classes such as List and Array.
FSharp.Control レイジー評価や非同期ワークフローなどのコントロール構成要素の型が含まれています。Contains types for control constructs such as lazy evaluation and asynchronous workflows.
FSharp.Text 関数など、書式設定された IO 用の関数が含まれてい printf ます。Contains functions for formatted IO, such as the printf function.

AutoOpen 属性AutoOpen Attribute

AutoOpenアセンブリが参照されたときに名前空間またはモジュールを自動的に開く場合は、アセンブリに属性を適用できます。You can apply the AutoOpen attribute to an assembly if you want to automatically open a namespace or module when the assembly is referenced. また、属性をモジュールに適用して、 AutoOpen 親モジュールまたは名前空間を開いたときに自動的にそのモジュールを開くようにすることもできます。You can also apply the AutoOpen attribute to a module to automatically open that module when the parent module or namespace is opened. 詳細については、「 Autoopenattribute」を参照してください。For more information, see AutoOpenAttribute.

RequireQualifiedAccess 属性RequireQualifiedAccess Attribute

一部のモジュール、レコード、または共用体型では、属性を指定でき RequireQualifiedAccess ます。Some modules, records, or union types may specify the RequireQualifiedAccess attribute. これらのモジュール、レコード、または共用体の要素を参照する場合は、インポート宣言を含めるかどうかに関係なく、修飾名を使用する必要があります。When you reference elements of those modules, records, or unions, you must use a qualified name regardless of whether you include an import declaration. 一般的に使用される名前を定義する型でこの属性を戦略的に使用すると、名前の競合を避けることができるため、ライブラリの変更に対するコードの回復性が向上します。If you use this attribute strategically on types that define commonly used names, you help avoid name collisions and thereby make code more resilient to changes in libraries. 詳細については、「 RequireQualifiedAccessAttribute」を参照してください。For more information, see RequireQualifiedAccessAttribute.

関連項目See also